【自然語言處理入門】03:利用線性迴歸對資料集進行分析預測(下)
阿新 • • 發佈:2019-01-02
上一篇中我們簡單的介紹了利用線性迴歸分析並預測波士頓房價資料集,那麼在這一篇中,將使用相同的模型來對紅酒資料集進行分析。
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
from sklearn.linear_model import LinearRegression #線性迴歸
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+"test.csv", header=None)
train_data = pd.read_csv(data_path+"train.csv", header=None)
return train_data,test_data
#資料處理
def deal_data(pd_data):
#獲取資料的行數,因為要出去欄位名,所以要-1
row_cnt = pd_data.shape[0]-1
#計算列數,因為在讀入資料時,沒有指定分隔符,所以所有列資料都是作為一列資料來讀入的,因此在計算列數時,將讀入的每一行按照;來分開
column_cnt = len(pd_data.iloc[0, 0].split(";"))
#empty 會建立一個沒有使用特定值來初始化的陣列。給這些方法傳遞一個元組作為形狀來建立高維陣列:
X = np.empty((row_cnt, column_cnt - 1 ))
Y = np.empty((row_cnt, 1))
column_name=pd_data.iloc[0, 0].split(";")
#開始獲取資料
for i in range(0, row_cnt):
#逐一將每一行進行分割(按;空格分割)
row_array = pd_data.iloc[i+1, 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,column_name
#把特徵標準化為均勻分佈
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'wine quality', fontsize=18)
plt.xlabel(u'case id', fontsize=15)
plt.ylabel(u'quality', 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,column_name=deal_data(train_data)
# print(train_X.shape)
# print(train_Y.shape)
test_X, test_Y,column_name=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 實驗結果
4 實驗小結
結果這兩個實驗可以看出,一般資料分析處理流程如下圖所示。
graph LR
資料讀取-->資料預處理
選擇模型-->訓練模型
資料預處理-->訓練模型
訓練模型-->測試模型
測試模型-->模型評估