<機器學習筆記-02> (scikit-learn 02)線性回歸
摘要:本文是“Mastering Machine Learning With scikit-learn”第二章“線性回歸”的學習筆記,對書中源碼進行實作,并對書中内容按照知識子產品進行整理,尤其是對python函數整理力求做到清晰有條理;
注1:筆記中重在功能實作,對于基本理論了解不深,以後還是需要加強的。
注2:本文第一次使用Pypora軟體寫成md檔案,然後上傳到MarkDown頁面,在序号排版方面比CSDN自帶的要好些,但是快捷鍵不如CSDN部落格友善,而數學公式和圖檔上傳還都不太熟悉;
-
知識要點總結:
-
基本概念:
-
掌握模型:一進制/多元線性回歸模型,一進制多項式回歸模型;
-
了解概念:損失函數、殘差;
-
了解回歸拟合模型參數估計,尤其是最小二乘法;了解正則化的常用方法(嶺回歸法,LASSO法,彈性網);
-
了解預測結果的方法,尤其是R-Square;
-
了解梯度下降法;
-
-
Python基本功能:
-
讀入庫/庫中的某個函數,或為其取别名;
-
掌握terminal輸入多行指令的方法;
-
使用def定義函數
-
使用print函數輸出文本和數字;
-
掌握for循環使用
-
掌握用enumerate()擷取清單的索引和數值
-
會用shape()和reshape()對Array的形狀進行操作;
-
掌握list的索引号調用方法;
-
-
Matplotlib庫
-
打開Inline顯示圖檔功能;
-
定義顯示圖檔的文字(大小+字型)、題目、坐标軸(名稱+範圍)、打開網格;
-
繪制不同顔色的點、線;
-
繪制散點分布圖;
-
-
Numpy庫
-
會求均值、方差、協方差;
-
會求矩陣的dot,inv,transpose();
-
使用lstsq()求最小二乘法;
-
-
Sklearn庫
-
會基于linear_model.LinearRegression建立一進制/多元線性回歸模型;會基于LinearRegression和preprocessing.PolynomialFeatures建立一進制多次線性回歸模型;會基于linear_model.SGDRegressor建立随機梯度下降SGD模型;
-
使用model.fit()模組化,使用model.predict()預測,使用model.score()求測試集的R-Square;
-
基于cross_validation,會用train_test_split()函數劃分訓練集和測試集,會用cross_val_score()計算交叉檢驗的R-Squre結果;
-
-
-
基本概念與理論分析
-
損失函數(loss function):用來定義模型與觀測值的誤差;
-
殘差(residuals):模型預測的數值與訓練集資料的差異,也叫訓練誤差(training erros);
-
LinearRegression類
學習方法下的fit()
-
一進制線性回歸模型為: y=a+bx ;
-
多元線性回歸模型為: y=a+b1x1+b2x2+...+bnxn
-
-
回歸拟合模型的參數估計常用方法是普通最小二乘法;對于一進制線性回歸的最小二乘法,相關系數 b <script type="math/tex" id="MathJax-Element-6">b</script> 可以通過方差和協方差求得;
-
R方(R-Square):确定系數(coefficent of determination),表示模型對現實資料拟合的程度;可以通過樣本總體平方和以及殘差平方和可以求得;
-
多元線性回歸 & 多項式回歸
-
正則化方法
-
嶺回歸(Ridge Regression,RR):增加L2範數項(相關系數向量平方和的平方根)來調整成本函數(殘差平方和)
-
最小收縮和選擇算子(LASSO),增加L1範數項(相關系數向量之和)來調整成本函數;
-
彈性網(elastic net)正則化方法:線性組合L1和L2範數項;
-
-
梯度下降法拟合:
-
每一次運算時,計算對應位置的導數,然後沿着梯度(變化最快的方向)相反的方向前進,總是垂直于等高線;
-
梯度下降法求出的是成本函數的局部最小值;一個三維凸(convex)函數所有點構成的圖形像一個碗;殘差平方和構成的成本函數是凸函數,是以可以找到全局最小值;
-
重要超參數是步長(learning rate),用來控制下降幅度;
-
分類:批量梯度下降(每次疊代用所有訓練樣本),随機梯度下降(SGD,每次疊代用随機選擇的訓練樣本)
-
-
-
程式設計積累
-
本筆記使用PyQt(qtconsole)IDE;
-
基本用法
-
縮進代表邏輯層次,代替C++中的大括号{};
-
注釋:單行使用#,多行使用”“” “”“;
-
terminal情況下輸入多行指令:要使用\;注意
plt1=runplt(); \ X=[[],[],[],[],[]] ;\ Y=[[],[],[],[],[]]; \ plt1.plot(X,Y,'k.'); \ plt1.show()
-
定義函數def
def runplt(): plt.figure() return plt
-
列印指令
,以及字元串%使用(一個是取餘數,一個是将數字轉化為字元串); .2f表示字元串格式為print()
print ('預測一張13寸披薩的價格:$%.2f'%model.predict([])[])
-
-string,%s
-整數ints%d
"Hello %s, my name is %s" % ('john', 'mike') # Hello john, my name is mike". "My name is %s and i'm %d" % ('john', ) #My name is john and i'm 12
-
使用
循環,得到數組的序号enumerate()
(放在前面的)和數值idx
(放在後面的);val
for idx, val in enumerate(ints): print(idx, val)
-
将區間進行劃分linspace()
xx = np.linspace(, , ) xx #輸出: array([ 0. , 6.5, 13. , 19.5, 26. ])
-
Y的shape如果是(n,m),array.shape[0]傳回n;reshape()将對array的形狀進行改變;
In []: Y = np.arange().reshape(,) In []: Y Out[]: array([[ , , , ], [ , , , ], [ , , , ]]) In []: Y.shape Out[]: (, ) In []: Y.shape[] Out[]:
-
list索引号
>>> a = [,,,,,] >>> a[:-] #輸出[1, 2, 3, 4, 5] >>> a[:] #輸出[2] >>> a[:] #輸出[2, 3, 4, 5, 6] >>> a[:] #輸出[1, 2, 3, 4, 5, 6]
-
-
matplotlib畫圖工具集合
-
開啟plot inline模式:繪制的圖将像其他計算結果一樣,直接顯示在terminal上面;
%matplotlib inline
-
讀入工具包matplotlib;import library as lib
-
字型定義:兩種字型定義的方法
#方法1 from matplotlib.font_manager import FontProperties font = FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=) #方法2 font2={'fontname':'Helvetica'} matplotlib.pyplot.title('匹薩價格與直徑資料',font2)#标題(名稱+字型)定義
-
2-D繪圖、标題、坐标軸定義(名稱+範圍)、顯示網格
matplotlib.pyplot.figure()#建立繪圖闆 matplotlib.pyplot.title('匹薩價格與直徑資料',fontproperties=font)#标題(名稱+字型)定義 matplotlib.pyplot.xlabel('直徑(英寸)',fontproperties=font)#X軸(名稱+字型)定義 matplotlib.pyplot.ylabel('價格(美元)',font2)#Y軸(名稱+字型)定義 matplotlib.pyplot.axis([, , , ]) #定義坐标軸的範圍 matplotlib.pyplot.grid(True)#顯示網格
-
繪制坐标點,顯示繪圖結果;注意繪圖時輸入的坐标應該為二維數組2-D Array
X = [[6], [8], [10], [14], [18]] y = [[7], [9], [13], [17.5], [18]] matplotlib.pyplot.plot(X, y, 'k.') matplotlib.pyplot.plot.show()
-
繪制類型:線色+類型(點或者線)
plt.plot(X, y, 'k.') #繪制黑色(k)點(.) plt.plot(X2, y2, 'g-') #繪制綠色(g)線(-) plt.plot(X2, y4, 'y-.')#繪制黃色(y)點劃線(-.)
-
實際使用繪圖工具時,可以先定義一個基本的函數模闆,裡面包括标題、坐标軸定義、字型等基本設定,然後再調用該模闆,在該模闆上進行适當地修改即可;
-
繪制散點分布圖scatter(,)
plt.scatter(df['alcohol'], df['quality'])
-
-
Numpy指令積累
-
調用Numpy庫
-
mean()求均值
print('殘差平均值: %.2f' % np.mean((model.predict(X) - y) ** ))
-
var()求方差
-
cov()求協方差
print(np.cov([6, 8, 10, 14, 18], [7, 9, 13, 17.5, 18])[0][1]) #numpy.cov()計算協方差
-
矩陣計算-求逆inv,點乘dot,轉置transpose
from numpy.linalg import inv from numpy import dot, transpose X = [[1, 6, 2], [1, 8, 1], [1, 10, 0], [1, 14, 2], [1, 18, 0]] y = [[7], [9], [13], [17.5], [18]] print(dot(inv(dot(transpose(X), X)), dot(transpose(X), y)))
-
最小二乘法
lstsq()
from numpy.linalg import lstsqprint(lstsq(X, y)[])
-
-
Sklearn指令積累
-
調入線性回歸函數LinearRegression;
from sklearn.linear_model import LinearRegression
-
fit()建立一進制線性回歸模型
X = [[8], [9], [11], [16], [12]] y = [[11], [8.5], [15], [18], [11]] model = LinearRegression() model.fit(X, y)#建立一進制線性回歸模型
-
fit()建立多元線性回歸模型
X = [[6, 2], [8, 1], [10, 0], [14, 2], [18, 0]] y = [[7], [9], [13], [17.5], [18]] model = LinearRegression() model.fit(X, y) #建立二進制線性回歸模型
-
predict()通過fit()算出的模型參數構成的模型,對解釋變量進行預測獲得的值;
print('預測一張12英寸匹薩價格:$%.2f' % model.predict([])[]) #單值預測 X_test = [[8, 2], [9, 0], [11, 2], [16, 2], [12, 0]] predictions = model.predict(X_test)#一組數進行預測
-
mode.score計算R方R-Square
-
建立一進制多項式回歸模型
from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures X_train = [[6], [8], [10], [14], [18]] y_train = [[7], [9], [13], [17.5], [18]] #需要輸入列向量,而不是行向量 X_test = [[6], [8], [11], [16]]#測試資料準備 y_test = [[8], [12], [15], [18]] quadratic_featurizer = PolynomialFeatures(degree=) #定義多項式的最高階數 X_train_quadratic = quadratic_featurizer.fit_transform(X_train) #為fit()模組化準備輸入 regressor_quadratic = LinearRegression() regressor_quadratic.fit(X_train_quadratic, y_train)# fit()函數模組化 X_test_quadratic = quadratic_featurizer.transform(X_test) #為預測準備輸入量 y_test_quadratic=regressor_quadratic.predict(xx_quadratic) #使用模型預測資料 print('一進制線性回歸 r-squared', regressor.score(X_test, y_test)) #計算R-Square
-
train_test_split()按資料集分成訓練集和測試集;分區比例可以設定,預設25%分給測試集;
from sklearn.cross_validation import train_test_split df = pd.read_csv('mlslpic/winequality-red.csv', sep=';') X = df[list(df.columns)[:-]] y = df['quality'] X_train, X_test, y_train, y_test = train_test_split(X, y)
-
cross_val_score()可以傳回交叉檢驗的score結果;
from sklearn.cross_validation import cross_val_score regressor = LinearRegression() scores = cross_val_score(regressor, X, y, cv=) print(scores.mean(), scores
-
加載scikit-learn資料集
from sklearn.datasets import load_boston
-
加載SGDRegressor,歸一化StandardScaler,建立模型以及求R-Square
from sklearn.linear_model import SGDRegressor from sklearn.preprocessing import StandardScaler X_scaler = StandardScaler() y_scaler = StandardScaler() X_train = X_scaler.fit_transform(X_train) y_train = y_scaler.fit_transform(y_train) X_test = X_scaler.transform(X_test) y_test = y_scaler.transform(y_test) regressor = SGDRegressor(loss='squared_loss') regressor.fit_transform(X_train, y_train) #建立模型 print('測試集R方值:', regressor.score(X_test, y_test))
-
-
pandas庫
-
讀入pandas庫;可以處理二維表
-
讀入csv檔案,read_csv
分隔符sep
df=pd.read_csv('C:/add.csv',sep=';')
-
顯示資料的前幾行、前幾列head()
df.head()
-
顯示統計結果describe()
df.describe()
-
顯示統計結果[' ']
df['alcohol']
-
-