常用的線性模型包括 : 線性回歸,嶺回歸,套索回歸,邏輯回歸,線性SVC
1.線性模型圖
import numpy as np import matplotlib.pyplot as plt #令x為-5到5之間,元素數為100的等差數列 x = np.linspace(-5,5,100) #輸入直線方程 y = 0.5*x + 3 plt.plot(x,y,c='orange') #圖題設為"Straight Line" plt.title('Straight Line') plt.show()
#導入線性回歸模型 from sklearn.linear_model import LinearRegression #輸入兩個點的橫坐標 X = [[1],[4]] #輸入兩個點的縱坐標 y = [3,5] #用線性模型擬合這兩個點 lr = LinearRegression().fit(X,y) #畫出兩個點和直線的圖形 z = np.linspace(0,5,20) plt.scatter(X,y,s=80) plt.plot(z,lr.predict(z.reshape(-1,1)),c='k') #設定圖題為Straight Line plt.title('Straight Line') #將圖片顯示出來 plt.show()
#對數據點分裂進行判斷 print('\n\n\n') print('直線方程為:') print('====================================') print('y={:.3f}'.format(lr.coef_[0]),'x','+ {:.3f}'.format(lr.intercept_)) print('====================================') print('\n\n\n')
直線方程為: ==================================== y=0.667 x + 2.333 ====================================
#輸入3個點的橫坐標 X = [[1],[4],[3]] #輸入3個點縱坐標 y = [3,5,3] #用線性模型擬合這3個點 lr = LinearRegression().fit(X,y) #畫出2個點和直線的圖形 z = np.linspace(0,5,20) plt.scatter(X,y,s=80) plt.plot(z,lr.predict(z.reshape(-1,1)),c='k') #設定圖題為Straight Line plt.title('Straight Line') #將圖片顯示出來 plt.show()
#對數據點分裂進行判斷 print('\n\n\n') print('直線方程為:') print('====================================') print('y={:.3f}'.format(lr.coef_[0]),'x','+ {:.3f}'.format(lr.intercept_)) print('====================================') print('\n\n\n')
直線方程為: ==================================== y=0.571 x + 2.143 ====================================
from sklearn.datasets import make_regression #生成用於回歸分析的數據集 X,y = make_regression(n_samples=50,n_features=1,n_informative=1,noise=50,random_state=1) #使用線性模型對數據進行擬合 reg = LinearRegression() reg.fit(X,y) #z是我們生成的等差數列,用來畫出線性模型的圖形 z = np.linspace(-3,3,200).reshape(-1,1) plt.scatter(X,y,c='b',s=60) plt.plot(z,reg.predict(z),c='k') plt.title('Linear Regression')
#對數據點分裂進行判斷 print('\n\n\n') print('代碼運行結果為:') print('====================================') #打印直線的系數和截距 print('直線的系數是:{:.2f}'.format(reg.coef_[0])) print('直線的截距是:{:.2f}'.format(reg.intercept_)) print('====================================') print('\n\n\n')
代碼運行結果為: ==================================== 直線的系數是:79.52 直線的截距是:10.92 ====================================
2.線性回歸模型
############################# 最基本的線性模型--線性回歸 ####################################### #導入數據集拆分工具 from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression X,y = make_regression(n_samples=100,n_features=2,n_informative=2,random_state=38) X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=8) lr = LinearRegression().fit(X_train,y_train) print('\n\n\n') print('代碼運行結果為:') print('====================================') print('lr.coef_:{}'.format(lr.coef_[:])) print('lr.intercept:{}'.format(lr.intercept_)) print('====================================') print('\n\n\n')
代碼運行結果為: ==================================== lr.coef_:[70.38592453 7.43213621] lr.intercept:-1.4210854715202004e-14 ====================================
print('\n\n\n') print('代碼運行結果為:') print('====================================') #打印直線的系數和截距 print('訓練數據集得分:{:.2f}'.format(lr.score(X_train,y_train))) print('測試數據集得分:{:.2f}'.format(lr.score(X_test,y_test))) print('====================================') print('\n\n\n')
代碼運行結果為: ==================================== 訓練數據集得分:1.00 測試數據集得分:1.00 ====================================
from sklearn.datasets import load_diabetes #載入糖尿病數據集 X,y = load_diabetes().data,load_diabetes().target #將數據集拆分成訓練集和測試集 X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=8) #使用線性回歸模型進行擬合 lr = LinearRegression().fit(X_train,y_train) print('\n\n\n') print('代碼運行結果為:') print('====================================') #打印直線的系數和截距 print('訓練數據集得分:{:.2f}'.format(lr.score(X_train,y_train))) print('測試數據集得分:{:.2f}'.format(lr.score(X_test,y_test))) print('====================================') print('\n\n\n')
代碼運行結果為: ==================================== 訓練數據集得分:0.53 測試數據集得分:0.46 ====================================
3.L2正則化的線性模型--嶺回歸
嶺回歸實際上是一種能夠避免過擬合的線性模型,在嶺回歸中,模型會保留所有的特征變量,但是會減小特征變量的系數值,讓特征變量對預測結果的影響變小,這種保留全部特征變量,只是降低特征變量的系數值來避免過擬合的方法,即嶺回歸.
############################# L2正則化的線性模型--嶺回歸 ####################################### #導入嶺回歸 from sklearn.linear_model import Ridge #使用嶺回歸對數據進行擬合 ridge = Ridge().fit(X_train,y_train) print('\n\n\n') print('代碼運行結果為:') print('====================================') #打印直線的系數和截距 print('嶺回歸的訓練數據集得分:{:.2f}'.format(ridge.score(X_train,y_train))) print('嶺回歸的測試數據集得分:{:.2f}'.format(ridge.score(X_test,y_test))) print('====================================') print('\n\n\n')
代碼運行結果為: ==================================== 嶺回歸的訓練數據集得分:0.43 嶺回歸的測試數據集得分:0.43 ====================================
#修改alpha參數為10 ridge10 = Ridge(alpha=10).fit(X_train,y_train) print('\n\n\n') print('代碼運行結果為:') print('====================================') #打印直線的系數和截距 print('嶺回歸的訓練數據集得分:{:.2f}'.format(ridge10.score(X_train,y_train))) print('嶺回歸的測試數據集得分:{:.2f}'.format(ridge10.score(X_test,y_test))) print('====================================') print('\n\n\n')
代碼運行結果為: ==================================== 嶺回歸的訓練數據集得分:0.15 嶺回歸的測試數據集得分:0.16 ====================================
#修改alpha參數為0.1 ridge01 = Ridge(alpha=0.1).fit(X_train,y_train) print('\n\n\n') print('代碼運行結果為:') print('====================================') #打印直線的系數和截距 print('嶺回歸的訓練數據集得分:{:.2f}'.format(ridge01.score(X_train,y_train))) print('嶺回歸的測試數據集得分:{:.2f}'.format(ridge01.score(X_test,y_test))) print('====================================') print('\n\n\n')
代碼運行結果為: ==================================== 嶺回歸的訓練數據集得分:0.52 嶺回歸的測試數據集得分:0.47 ====================================
#繪制alpha=1時的模型系數 plt.plot(ridge.coef_,'s',label = 'Ridge alpha=1') #繪制alpha=10時的模型系數 plt.plot(ridge10.coef_,'^',label = 'Ridge alpha=10') #繪制alpha=1時的模型系數 plt.plot(ridge01.coef_,'v',label = 'Ridge alpha=0.1') #繪制線性回歸的系數作為對比 plt.plot(lr.coef_,'o',label = 'linear regression') plt.xlabel("coefficient index") plt.ylabel("coefficient magnitude") plt.hlines(0,0,len(lr.coef_)) plt.legend()
from sklearn.model_selection import learning_curve,KFold #定義一個繪制學習曲線的函數 def plot_learning_curve(est,X,y): #將數據進行20次拆分用來對模型進行評分 training_set_size,train_scores,test_scores = learning_curve(est,X,y,train_sizes=np.linspace(.1,1,20),cv=KFold(20,shuffle=True,random_state=1)) estimator_name = est.__class__.__name__ line = plt.plot(training_set_size,train_scores.mean(axis=1),'--',label="training" + estimator_name) plt.plot(training_set_size,test_scores.mean(axis=1),'-',label="test" + estimator_name,c=line[0].get_color()) plt.xlabel('Training set size') plt.ylabel('Score') plt.ylim(0,1.1) plot_learning_curve(Ridge(alpha=1),X,y) plot_learning_curve(LinearRegression(),X,y) plt.legend(loc=(0,1.05),ncol=2,fontsize=11)
4.L1正則化的線性模型--套索回歸
套索回歸是將系數限制在非常接近於0的范圍內,但是其進行限制的方式我們稱之為L1正則化,
L1正則化 : 就是我們使用套索回歸時,有一部分特征的系數正好等於0,即有一些特征會徹底被模型忽略掉,這也是模型對於特征進行自動選擇的一種方式,
############################# L1正則化的線性模型--套索回歸 ####################################### #導入嶺回歸 from sklearn.linear_model import Lasso #使用嶺回歸對數據進行擬合 lasso = Lasso().fit(X_train,y_train) print('\n\n\n') print('代碼運行結果為:') print('====================================') #打印直線的系數和截距 print('套索回歸的訓練數據集得分:{:.2f}'.format(lasso.score(X_train,y_train))) print('套索回歸的測試數據集得分:{:.2f}'.format(lasso.score(X_test,y_test))) print('套索回歸使用的特征集:{}'.format(np.sum(lasso.coef_!=0))) print('====================================') print('\n\n\n')
代碼運行結果為: ==================================== 套索回歸的訓練數據集得分:0.36 套索回歸的測試數據集得分:0.37 套索回歸使用的特征集:3 ====================================
#增加最大迭代次數的默認設置 #否則模型會提示我們增加最大跌打次數 lasso01 = Lasso(alpha=0.1,max_iter=100000).fit(X_train,y_train) print('\n\n\n') print('代碼運行結果為:') print('====================================') print('alpha=0.1時套索回歸在訓練數據集的得分:{:.2f}'.format(lasso01.score(X_train,y_train))) print('alpha=0.1時套索回歸在測試數據集得分:{:.2f}'.format(lasso01.score(X_test,y_test))) print('alpha=0.1時套索回歸使用的特征數:{}'.format(np.sum(lasso01.coef_!=0))) print('====================================') print('\n\n\n')
代碼運行結果為: ==================================== alpha=0.1時套索回歸在訓練數據集的得分:0.52 alpha=0.1時套索回歸在測試數據集得分:0.48 alpha=0.1時套索回歸使用的特征數:7 ====================================
#修改alpha值為0.0001 lasso00001 = Lasso(alpha=0.0001,max_iter=100000).fit(X_train,y_train) print('\n\n\n') print('代碼運行結果為:') print('====================================') print('alpha=0.0001時套索回歸在訓練數據集的得分:{:.2f}'.format(lasso00001.score(X_train,y_train))) print('alpha=0.0001時套索回歸在測試數據集得分:{:.2f}'.format(lasso00001.score(X_test,y_test))) print('alpha=0.0001時套索回歸使用的特征數:{}'.format(np.sum(lasso00001.coef_!=0))) print('====================================') print('\n\n\n')
代碼運行結果為: ==================================== alpha=0.0001時套索回歸在訓練數據集的得分:0.53 alpha=0.0001時套索回歸在測試數據集得分:0.46 alpha=0.0001時套索回歸使用的特征數:10 ====================================
#繪制alpha=1時的模型系數 plt.plot(lasso.coef_,'s',label = 'Lasso alpha=1') #繪制alpha=10時的模型系數 plt.plot(lasso01.coef_,'^',label = 'Lasso alpha=0.1') #繪制alpha=1時的模型系數 plt.plot(lasso00001.coef_,'v',label = 'Lasso alpha=0.0001') #繪制線性回歸的系數作為對比 plt.plot(ridge01.coef_,'o',label = 'Ridge alpha=0.1') plt.legend(ncol=2,loc=(0,1.05)) plt.ylim(-1050,800) plt.xlabel("coefficient index") plt.ylabel("coefficient magnitude")
總結:
線性回歸,嶺回歸和套索回歸是通過alpha參數來進行調節的.
邏輯回歸(邏輯斯蒂回歸),線性SVC(線性支持向量機)是通過參數C來調節的.
選擇L1正則化模型還是L2正則化模型?
原則 : 如果數據集有很多特征,而這些特征中並不是每一個都對結果有重要影響,那么就選L1正則化模型(如:套索回歸)
如果數據集中的特征本來就不多,而且每一個都有重要作用的化,就選L2正則化模型(如:嶺回歸)
我們使用線性模型是因為其訓練模型的速度非常快,尤其針對那些超大型數據集來講.相反,當數據集的特征較少時,線性模型的表現會相對的偏弱,這是我們可以進行數據預處理(數據升維),來提高線性模型的准確率.
文章引自:《深入淺出python機器學習》