1. 程式人生 > >python資料探勘筆記】十八.線性迴歸及多項式迴歸分析四個案例分享

python資料探勘筆記】十八.線性迴歸及多項式迴歸分析四個案例分享

python資料探勘課程】十八.線性迴歸及多項式迴歸分析四個案例分享 
#2018-03-30 18:24:56 March Friday the 13 week, the 089 day SZ SSMR
 1.線性迴歸預測Pizza價格案例
    2.線性迴歸分析波士頓房價案例
    3.隨機資料集一元線性迴歸分析和三維迴歸分析案例
    4.Pizza資料集一元線性迴歸和多元線性迴歸分析


一. 線性迴歸預測Pizza價格案例
1.資料集介紹

本章主要使用線性迴歸預測Pizza的價格,由於直徑大小不同的Pizza,其價格也是不同的
2.線性迴歸分析

線性迴歸基礎步驟主要包括:
    1.匯入資料集,採用列表的形式定義直接和價格兩列資料。
    2.呼叫Scikit-learn機器學習包中線性迴歸模型。
    3.呼叫fit()函式對直徑和價格進行訓練。
    4.呼叫predice()函式對資料集進行預測。
    5.對線性迴歸演算法進行評價。
    6.視覺化分析並繪製相關圖形,直觀的呈現演算法模型的結果。
線性迴歸分析的完整程式碼如下:
# -*- coding: utf-8 -*-
from sklearn.linear_model import LinearRegression

#資料集 直徑、價格
x = [[5],[6],[7],[8],[10],[11],[13],[14],[16],[18]]
y = [[6],[7.5],[8.6],[9],[12],[13.6],[15.8],[18.5],[19.2],[20]]

clf = LinearRegression()
clf.fit(x,y)                #fit()函式用來分析模型引數
pre = clf.predict([12][0])  #predict()通過fit()算出模型引數構成的模型,對解釋變數進行預測獲得其結果
print(u'預測直徑為12英寸的價格: $%.2f' % pre)

3.視覺化分析

接下來需要對資料集進行視覺化分析,首先需要呼叫Matplotlib擴充套件包繪製直徑和價格的散點圖,程式碼如下:
# -*- coding: utf-8 -*-
from sklearn.linear_model import LinearRegression

#資料集 直徑、價格
x = [[5],[6],[7],[8],[10],[11],[13],[14],[16],[18]]
y = [[6],[7.5],[8.6],[9],[12],[13.6],[15.8],[18.5],[19.2],[20]]

clf = LinearRegression()
clf.fit(x,y)                #fit()函式用來分析模型引數
pre = clf.predict([12][0])  #predict()通過fit()算出模型引數構成的模型,對解釋變數進行預測獲得其結果
print(u'預測直徑為12英寸的價格: $%.2f' % pre)

x2 = [[0],[12],[15],[25]]
y2 = clf.predict(x2)
print(y2)
import matplotlib.pyplot as plt
plt.figure()
plt.rcParams['font.sans-serif'] = ['SimHei'] #指定預設字型
plt.title(u"線性迴歸預測Pizza直徑和價格")
plt.xlabel(u"x")
plt.ylabel(u"price")
plt.axis([0,25,0,25])
plt.scatter(x,y,marker="s",s=20) #畫散點圖
plt.plot(x2,y2,"g-") #畫直線
plt.show()

二. 線性迴歸分析波士頓房價案例
Sklearn機器學習包中已經自帶了該資料集,故直接引用該資料集,獲取其中某兩列資料.



在做資料分析過程中,通常需要將資料集劃分為訓練集和預測集,這裡作者將前406行作為訓練集,最後100行作為預測集,劃分程式碼如下:
# -*- coding: utf-8 -*-
#匯入資料集boston
from sklearn.datasets import load_boston
import numpy as np 
boston = load_boston()    
print(boston.data.shape, boston.target.shape)
print (boston.data[10])
print ("boston.data is :",len(boston.data))

print (boston.target)
print ("boston.target is:",len(boston.target))


#劃分資料集
boston_temp = boston.data[:, np.newaxis, 5]   
x_train = boston_temp[:-100]      #訓練樣本  
x_test = boston_temp[-100:]       #測試樣本 後100行  
y_train = boston.target[:-100]    #訓練標記  
y_test = boston.target[-100:]     #預測對比標記


2.線性迴歸分析
線性迴歸過程主要如下:
    1.匯入資料集,波士頓房價資料。
    2.劃分資料集為訓練集和測試集,採用406和100的比例。
    3.匯入線性迴歸模型LinearRegression。
    4.對訓練集進行訓練操作,同時預測資料集結果。
    5.視覺化畫圖分析及結果評估。

線性迴歸分析波士頓房價資料集的程式碼如下:
# -*- coding: utf-8 -*-
#匯入資料集boston
from sklearn.datasets import load_boston
import numpy as np 
boston = load_boston()    
print(boston.data.shape, boston.target.shape)
print (boston.data[10])
print ("boston.data is :",len(boston.data))

#print (boston.target)
print ("boston.target is:",len(boston.target))
#劃分資料集
boston_temp = boston.data[:, np.newaxis, 5]   
x_train = boston_temp[:-100]      #訓練樣本  
x_test = boston_temp[-100:]       #測試樣本 後100行  
y_train = boston.target[:-100]    #訓練標記  
y_test = boston.target[-100:]     #預測對比標記

from sklearn.linear_model import LinearRegression 
clf = LinearRegression()  
clf.fit(x_train, y_train)  

#演算法評估
pre = clf.predict(x_test)
print (u"預測結果", pre)
print (u"真實結果", y_test)
cost = np.mean(y_test-pre)**2  
print (u'平方和計算:', cost)  
print (u'係數', clf.coef_   )
print (u'截距', clf.intercept_)    
print (u'方差', clf.score(x_test, y_test) )

#繪圖分析
import matplotlib.pyplot  as plt
plt.title(u'LinearRegression Boston')     
plt.xlabel(u'x')                   
plt.ylabel(u'price')          
plt.scatter(x_test, y_test, color = 'black')  
plt.plot(x_test, clf.predict(x_test), color='blue', linewidth = 3)
'''
for idx, m in enumerate(x_test):  
    plt.plot([m, m],[y_test[idx],pre[idx]], 'r-')    
    '''
plt.show()   

三. 隨機資料集線性迴歸分析和三維迴歸分析案例


1.隨機資料集
隨機數生成主要呼叫Numpy擴充套件包中的random函式或arange,呼叫函式arange(0,50,0.2)實現,隨機生成0到50個數據,其間隔為0.2。
得到X資料集之後,作者隨機定義一個函式繪製對應的Y座標,再呼叫Matplotlib擴充套件包可以對資料集進行視覺化分析,並繪製相關的散點圖。核心程式碼如下:
import numpy as np
import math
X =  np.arange(0,50,0.2) 
print (X)
xArr = []
yArr = []
for n in X:
    xArr.append(n)
    y = 0.7*n + np.random.uniform(0,1)*math.sin(n)*2 - 3
    yArr.append(y)

import matplotlib.pyplot as plt
plt.plot(xArr, yArr, 'go')

plt.show()

接下來需要呼叫Sklearn機器學習擴充套件包相關函式進行線性迴歸分析。

2.線性迴歸
完整程式碼如下:
import numpy as np
import math
X =  np.arange(0,50,0.2) 
print (X)
xArr = []
yArr = []
for n in X:
    xArr.append(n)
    y = 0.7*n + np.random.uniform(0,1)*math.sin(n)*2 - 3
    yArr.append(y)
'''
import matplotlib.pyplot as plt
plt.plot(xArr, yArr, '*')

plt.show()
'''


#線性迴歸分析
from sklearn.linear_model import LinearRegression
clf = LinearRegression()
print (clf)
X =  np.array(X).reshape((len(X),1))     #list列表轉化為陣列
print('X is:',X)
yArr = np.array(yArr).reshape((len(X),1))
clf.fit(X,yArr) #輸入為陣列
pre = clf.predict(X)

import matplotlib.pyplot as plt
plt.plot(X, yArr, 'go')
plt.plot(X, pre, 'r', linewidth=3)
plt.show()

補充一段3D繪製的程式碼,隨機座標生成後,需要呼叫mpl_toolkits.mplot3d子類中Axes3D類生成對應的3D圖形。
程式碼:
# -*- coding: utf-8 -*-
import numpy as np
from sklearn import linear_model
from mpl_toolkits.mplot3d import Axes3D   #3D畫圖模組
import matplotlib.pyplot as plt
import math

#linspace:開始值、終值和元素個數建立表示等差數列的一維陣列
xx, yy = np.meshgrid(np.linspace(0,10,20), np.linspace(0,100,20))
print("np.linspace(0,10,20 is :",np.linspace(0,10,20))   #列表就是方括號裡面有很多空格分開的資料,陣列就是方括號中有很多方括號包含著的資料
zz = 2.4 * xx + 4.5 * yy + np.random.randint(0,100,(20,20))
#構建成特徵、值的形式
X, Z = np.column_stack((xx.flatten(),yy.flatten())), zz.flatten()
print("xx.flatten() is:",xx.flatten())
#線性迴歸分析
regr = linear_model.LinearRegression()
regr.fit(X, Z)
#預測的一個特徵
x_test = np.array([[15.7, 91.6]])
print (regr.predict(x_test))
#畫圖視覺化分析
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.scatter(xx, yy, zz) #真實點
#擬合的平面
ax.plot_wireframe(xx, yy, regr.predict(X).reshape(20,20))
ax.plot_surface(xx, yy, regr.predict(X).reshape(20,20), alpha=0.3)
plt.show()


四. Pizza資料集一元和多元線性迴歸分析
from sklearn.linear_model import LinearRegression

#資料集 直徑、價格
x = [[5],[6],[7],[8],[10],[11],[13],[14],[16],[18]]
y = [[6],[7.5],[8.6],[9],[12],[13.6],[15.8],[18.5],[19.2],[20]]


clf = LinearRegression()
clf.fit(x,y)
pre = clf.predict([12])[0]
print(u'預測直徑為12英寸的價格: $%.2f' % pre)
x2 = [[0],[12],[15],[25]]
y2 = clf.predict(x2)

import matplotlib.pyplot as plt
import numpy as np

plt.figure()
plt.axis([0,25,0,25])
plt.scatter(x,y,marker="s",s=20)
plt.plot(x2,y2,"g-")

#匯入多項式迴歸模型
from sklearn.preprocessing import PolynomialFeatures
xx = np.linspace(0,25,100) #0到25等差數列
quadratic_featurizer = PolynomialFeatures(degree = 2) #例項化一個二次多項式
x_train_quadratic = quadratic_featurizer.fit_transform(x) #用二次多項式多樣本x做變換
X_test_quadratic = quadratic_featurizer.transform(x2)
regressor_quadratic = LinearRegression()
regressor_quadratic.fit(x_train_quadratic, y)
xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1))# 把訓練好X值的多項式特徵例項應用到一系列點上,形成矩陣

plt.plot(xx, regressor_quadratic.predict(xx_quadratic),
         label="$y = ax^2 + bx + c$",linewidth=2,color="r")
plt.legend()
plt.show()