Python機器學習理論與實戰系列重點為大家介紹利用Python進行機器學習實戰的內容,每一章會先花一點時間簡單介紹一下模型的理論部分,然後是重點講解利用Python實現模型並將其運用到實踐中。
線性迴歸的理論
對於給定數據集 D = { (x11, x21, .., xd1; y1), (x12, x22, .., xd2; y2), (x1m, x2m, .., xdm; ym)}, xi• 是 x 在第 i 個屬性上的取值,線性迴歸(Linear Regression)試圖學得一個通過屬性的線性組合來預測 y 的真實值的函數,即:
一般用向量表示:
一元線性迴歸:自變量x只有一個屬性
多元線性迴歸:自變量x有多個屬性
廣義線性迴歸:
g(.)稱為聯繫函數,起到了將線性迴歸模型的預測值與真實值聯繫起來的作用。
線性迴歸的優化目標及學習方式
優化目標:最小二乘損失/離差平方和最小
線性迴歸模型的參數學習
精確計算的解析算法:對優化目標求偏導,令一階導數為0
快速估計的數值優化算法
梯度下降法(Gradient Descend Method)
牛頓法(Newton Method)
……
關於線性迴歸的更多內容可以查看作者之前寫的文章,想要學人工智能,你必須得先懂點統計學系列:
線性迴歸實戰——美國波士頓房價預測
注:以下均在python3環境下編寫,python2在個別語句上可能會報錯。
第一步:數據描述
數據描述一般包括以下四個步驟,目的是讓你對需要分析的數據有一個比較全面的瞭解。
數據初看
數據的基本統計信息/完整性/理解數據
數據的描述性統計信息
數據可視化
#導入房價數據讀取器from sklearn.datasets import load_boston#讀取房價數據存儲在變量boston中boston=load_boston()#輸出數據描述print (boston.DESCR)
根據輸出結果可以得到:
共506條數據
13項數值型或者類別型預測變量
目標變量為房價
沒有缺失值
各個屬性的具體信息為:
- CRIM per capita crime rate by town
- ZN proportion of residential land zoned for lots over 25,000 sq.ft.
- INDUS proportion of non-retail business acres per town
- CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
- NOX nitric oxides concentration (parts per 10 million)
- RM average number of rooms per dwelling
- AGE proportion of owner-occupied units built prior to 1940
- DIS weighted distances to five Boston employment centres
- RAD index of accessibility to radial highways
- TAX full-value property-tax rate per $10,000
- PTRATIO pupil-teacher ratio by town
- B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
- LSTAT % lower status of the population
- MEDV Median value of owner-occupied homes in $1000's
對應的中文解釋為:
- CRIM:城鎮人均犯罪率
- ZN:住宅用地所佔比例
- INDUS:城鎮中非商業用地的所佔比例
- CHAS:CHAS查爾斯河虛擬變量
- NOX:環保指標
- RM:每棟住宅的房間數
- AGE:1940年以前建成的自住單位的比例
- DIS:距離五個波士頓就業中心的加權距離
- RAD:距離告訴公路的便利指數
- TAX:每一萬美元的不動產稅率
- PTRATIO:城鎮中教師學生比例
- B:城鎮中黑人比例
- LSTAT:地區有多少百分比的房東屬於低收入階層
目標:MEDV:自住房屋房價的中位數
數據可視化:做出各個因素對房價的影響圖形,為特徵工程做準備
#數據可視化#導入matplotlib.pyplot做可視化import matplotlib.pyplot as plt#設置繪圖風格為ggplotplt.style.use("ggplot")#首先設定一個畫布或者叫圖紙,尺寸為 6 × (4*13)fig = plt.figure(figsize=(6,4*13))for i in range(0,13):plt.subplot2grid((13,1),(i,0)) plt.scatter(boston.data[:,i],boston.target,c='red')plt.xlabel(boston.feature_names[i])plt.ylabel('Price')plt.show
第二步:特徵工程
數據類型
名義(Nominal):無序列別變量,比如乘客性別:男/女
有序(Ordinal):有序類別變量,比如乘客劃分為:低/中/高
度量(Scale):連續性變量,比如年齡
特徵分析和處理
名義變量: One-Hot編碼
有序變量:按照因變量影響由小到大的順序編碼為1,2,3,…
缺失值填充
特徵選擇
第三步:建立模型
數據分割:分為測試集和訓練集
#數據分割# 從sklearn.cross_validation導入數據分割器from sklearn.cross_validation import train_test_split# 導入numpy並重命名為npimport numpy as npX = boston.datay = boston.target# 隨機採樣25%的數據構建測試樣本,其餘作為訓練樣本X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.25)
數據標準化:使得預測結果不會被某些維度中過大的特徵值而主導
# 從sklearn.preprocessing導入數據標準化模塊from sklearn.preprocessing import StandardScaler# 分別初始化對特徵和目標值的標準化器ss_X = StandardScaler()ss_y = StandardScaler()# 分別對訓練和測試數據的特徵以及目標值進行標準化處理X_train = ss_X.fit_transform(X_train)X_test = ss_X.transform(X_test)y_train = ss_y.fit_transform(y_train)y_test = ss_y.transform(y_test)
訓練模型參數
# 從sklearn.linear_model導入LinearRegressionfrom sklearn.linear_model import LinearRegression# 使用默認配置初始化線性迴歸器LinearRegressionlr = LinearRegression()# 使用訓練數據進行參數估計lr.fit(X_train, y_train)
對測試集數據進行預測
# 對測試數據進行迴歸預測lr_y_predict = lr.predict(X_test)
第四步:性能評估
線性迴歸模型兩個最主要的評價指標:
均方誤差MSE:
表示預測值和真實值之間的均方誤差,越接近於0表示模型的預測精度越高。
判定係數R2:
表示自變量對因變量的解釋程度,R2越接近於1表示模型的擬合優度越好。
# 使用LinearRegression模型自帶的評估模塊,並輸出評估結果print ('The value of default measurement of LinearRegression is', lr.score(X_test, y_test))# 從sklearn.metrics依次導入r2_score、mean_squared_error以及mean_absoluate_error用於迴歸性能的評估from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error# 使用r2_score模塊,並輸出評估結果print ('The value of R-squared of LinearRegression is', r2_score(y_test, lr_y_predict))# 使用mean_squared_error模塊,並輸出評估結果print ('The mean squared error of LinearRegression is', mean_squared_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(lr_y_predict)))# 使用mean_absolute_error模塊,並輸出評估結果print ('The mean absoluate error of LinearRegression is', mean_absolute_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(lr_y_predict)))
結果:
The value of default measurement of LinearRegression is 0.6763403831The value of R-squared of LinearRegression is 0.6763403831The mean squared error of LinearRegression is 25.0969856921The mean absoluate error of LinearRegression is 3.5261239964
由此可見,默認輸出的是R2,通過其他模塊分別得到了均方誤差和平均絕對誤差的值可以幫助我們更好地評價模型。從目前的結果來看,R2=0.67,說明模型還存在很大的改進空間,也就是各個因素對房價的影響並不是線性的,改用非線性模型可以再提高模型的擬合優度,後續將會做進一步的探索。