python資料探勘筆記】十八.線性迴歸及多項式迴歸分析四個案例分享
阿新 • • 發佈:2019-01-06
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()