廣義線性模型


常用的線性模型包括 :  線性回歸,嶺回歸,套索回歸,邏輯回歸,線性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機器學習》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM