【自然語言處理入門】03:利用線性迴歸對資料集進行分析預測(上)
阿新 • • 發佈:2019-01-08
本篇筆記是《從自然語言處理到機器學習入門》課程第三次作業的上篇,主要是復現了老大課上講的利用線性迴歸對波士頓房價進行預測的實驗。在下篇中,將利用該模型對紅酒資料集進行線性迴歸分析。
1 基本要求
利用提供的波士頓房價資料,對其進行分析。資料地址,訓練集合測試集已經分好了。
2 完整程式碼
#-*- coding: UTF-8 -*-
# @Time : 2017/12/21 9:29
# @Author : xiongzongyang
# @Software: PyCharm
import pandas as pd
from pandas import Series, DataFrame
import numpy as np
import matplotlib.pyplot as plt
import sklearn
# from sklean.model_selection import train_test_split
from sklearn.linear_model import LinearRegression #線性迴歸
from sklearn.linear_model import Ridge #嶺迴歸
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNetCV
from sklearn.metrics import mean_squared_error
import matplotlib as mpl
import matplotlib.pyplot as plt
#讀取資料
def read_data(data_path="./data/"):
test_data = pd.read_csv(data_path+"boston_house.test", header=None)
train_data = pd.read_csv(data_path+"boston_house.train", header=None)
#測試資料是否讀取成功
# print(train_data)
# print(test_data.head())
# #檢視資料的規模
# print(train_data.shape)
# print(test_data.shape)
return train_data,test_data
#資料處理
def deal_data(pd_data):
#獲取資料的行數
row_cnt = pd_data.shape[0]
#print(row_cnt)
#計算列數,因為在讀入資料時,沒有指定分隔符,所以14列資料都是作為一列資料來讀入的,因此在計算列數時,將讀入的每一行按照空格來分開
column_cnt = len(pd_data.iloc[0, 0].split())
#print(column_cnt)
#empty 會建立一個沒有使用特定值來初始化的陣列。給這些方法傳遞一個元組作為形狀來建立高維陣列:
X = np.empty((row_cnt, column_cnt - 1))
# print(X)
#建立一個高位陣列
Y = np.empty((row_cnt, 1))
for i in range(0, row_cnt):
#逐一將每一行進行分割(按空格分割)
row_array = pd_data.iloc[i, 0].split()
#x取前13個數據,X[i]是一個一維陣列,則X相當於一個二維陣列,Y同理
X[i] = np.array(row_array[0:-1])
#y取最後一個數據
Y[i] = np.array(row_array[-1])
return X, Y
#把特徵標準化為均勻分佈
def uniform_norm(X):
X_max = X.max(axis=0)
X_min = X.min(axis=0)
return (X - X_min) / (X_max - X_min), X_max, X_min
#實現線性迴歸
#畫圖
def draw(pred,test_Y):
t = np.arange(len(pred))
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False
plt.figure(facecolor='w')
plt.plot(t, test_Y, 'r-', lw=2, label=u'true value')
plt.plot(t, pred, 'b-', lw=2, label=u'estimated')
plt.legend(loc='best')
plt.title(u'Boston house price', fontsize=18)
plt.xlabel(u'case id', fontsize=15)
plt.ylabel(u'house price', fontsize=15)
plt.grid()
plt.show()
#模型評估
def evaluate(unif_train_X,train_Y,unif_test_X,test_Y):
print("訓練集上效果評估:")
pred_train = model.predict(unif_train_X)
print("R^2係數 ", model.score(unif_train_X, train_Y))
print("均方誤差 ", mean_squared_error(train_Y, pred_train))
print("\n測試集上效果評估 :")
r2 = model.score(unif_test_X, test_Y)
print("R^2係數 ", r2)
pred = model.predict(unif_test_X)
print("均方誤差 ", mean_squared_error(test_Y, pred))
#主函式
if __name__ == "__main__":
#讀取資料
train_data,test_data=read_data()
#資料處理
train_X, train_Y=deal_data(train_data)
# print(train_X.shape)
# print(train_Y.shape)
test_X, test_Y=deal_data(test_data)
# print(test_X.shape)
# print(test_Y.shape)
#把特徵標準化為均勻分佈
unif_train_X, max_X, min_X = uniform_norm(train_X)
unif_test_X = (test_X - min_X) / (max_X - min_X)
#實現線性迴歸
model = LinearRegression()
model.fit(unif_train_X, train_Y)
#在訓練集上預測
pred_train = model.predict(unif_train_X)
#在測試集上預測
pred = model.predict(unif_test_X)
#畫圖
draw(pred,test_Y)
#模型評估
evaluate(unif_train_X,train_Y,unif_test_X,test_Y)
3 實驗效果
(1)預測的效果圖
(2)效果評估
4 相關知識點
本個實驗中主要涉及到了以下知識點:
(1)線性迴歸
(2)pandas,numpy,matplotlib等相關python科學計算庫
(3)資料的預處理也非常重要,熟練掌握資料預處理方法對以後的工作中或者是在讀別人程式碼時會輕鬆很多。