一滚秩、相關(guān)性分析有6種方法
參考與學(xué)習(xí)
做數(shù)據(jù)分析時(shí),為了提煉觀點(diǎn),相關(guān)性分析是必不可少,而且尤為重要的一個(gè)環(huán)節(jié)溢陪。但是,對(duì)于不同類型的數(shù)據(jù)睛廊,相關(guān)性分析的方法都各不相同形真。本文,主要按照不同的數(shù)據(jù)類型超全,來(lái)對(duì)各種相關(guān)性分析方法進(jìn)行梳理總結(jié)咆霜。
相關(guān)性分析是指對(duì)兩個(gè)或多個(gè)具備相關(guān)性的變量元素進(jìn)行分析,相關(guān)性不等于因果性嘶朱。
- 離散與離散變量之間的相關(guān)性
卡方檢驗(yàn)
首先這里說(shuō)的卡方檢驗(yàn)是特指卡方獨(dú)立性檢驗(yàn)蛾坯,因?yàn)榭ǚ綑z驗(yàn)除了可以分析兩個(gè)變量的相關(guān)性之外更常用的是做卡方擬合優(yōu)度檢驗(yàn)(單變量檢驗(yàn)),這里需要特別注意。
卡方檢驗(yàn)是一種用途很廣的計(jì)數(shù)資料的假設(shè)檢驗(yàn)方法疏遏。它屬于非參數(shù)檢驗(yàn)的范疇偿衰,主要是比較兩個(gè)及兩個(gè)以上樣本率( 構(gòu)成比)以及兩個(gè)分類變量的關(guān)聯(lián)性分析挂疆。其根本思想就是在于比較理論頻數(shù)和實(shí)際頻數(shù)的吻合程度或擬合優(yōu)度問(wèn)題。
它在分類資料統(tǒng)計(jì)推斷中的應(yīng)用下翎,包括:兩個(gè)率或兩個(gè)構(gòu)成比比較的卡方檢驗(yàn);多個(gè)率或多個(gè)構(gòu)成比比較的卡方檢驗(yàn)以及分類資料的相關(guān)分析等宝当。
(1)假設(shè)视事,多個(gè)變量之間不相關(guān)
(2)根據(jù)假設(shè)計(jì)算得出每種情況的理論值,根據(jù)理論值與實(shí)際值的差別庆揩,計(jì)算得到卡方值 及 自由度
df=(C-1)(R-1)
(3)查卡方表俐东,求p值
卡方值越大订晌,P值越小,變量相關(guān)的可能性越大锈拨,當(dāng)P<=0.05萌焰,否定原假設(shè)扒俯,認(rèn)為變量相關(guān)。
信息增益和信息增益率
在介紹信息增益之前一疯,先來(lái)介紹兩個(gè)基礎(chǔ)概念撼玄,信息熵和條件熵。
信息熵违施,就是一個(gè)隨機(jī)變量的不確定性程度互纯。
條件熵,就是在一個(gè)條件下磕蒲,隨機(jī)變量的不確定性留潦。
(1)信息增益:熵 - 條件熵
在一個(gè)條件下,信息不確定性減少的程度辣往。
Gain(Y,X)=H(Y)-H(Y|X)
信息增益越大兔院,表示引入條件X之后,不純度減少得越多站削。信息增益越大坊萝,則兩個(gè)變量之間的相關(guān)性越大。
(2)信息增益率
假設(shè),某個(gè)變量存在大量的不同值十偶,例如ID菩鲜,引入ID后,每個(gè)子節(jié)點(diǎn)的不純度都為0惦积,則信息增益減少程度達(dá)到最大接校。所以,當(dāng)不同變量的取值數(shù)量差別很大時(shí)狮崩,引入取值多的變量蛛勉,信息增益更大。因此睦柴,使用信息增益率诽凌,考慮到分支個(gè)數(shù)的影響。
Gain_ratio=(H(Y)-H(Y|X))/H(Y|X)
-
連續(xù)與連續(xù)變量之間的相關(guān)性
協(xié)方差
協(xié)方差坦敌,表達(dá)了兩個(gè)隨機(jī)變量的協(xié)同變化關(guān)系侣诵。如果兩個(gè)變量不相關(guān),則協(xié)方差為0恬试。
Cov(X,Y)=E{[X-E(X)],[Y-E(Y)]}
當(dāng) cov(X, Y)>0時(shí)窝趣,表明 X與Y 正相關(guān);
當(dāng) cov(X, Y)<0時(shí)训柴,表明X與Y負(fù)相關(guān)哑舒;
當(dāng) cov(X, Y)=0時(shí),表明X與Y不相關(guān)幻馁。
協(xié)方差只能對(duì)兩組數(shù)據(jù)進(jìn)行相關(guān)性分析洗鸵,當(dāng)有兩組以上數(shù)據(jù)時(shí)就需要使用協(xié)方差矩陣。
協(xié)方差通過(guò)數(shù)字衡量變量間的相關(guān)性仗嗦,正值表示正相關(guān)膘滨,負(fù)值表示負(fù)相關(guān)。但無(wú)法對(duì)相關(guān)的密切程度進(jìn)行度量稀拐。當(dāng)我們面對(duì)多個(gè)變量時(shí)火邓,無(wú)法通過(guò)協(xié)方差來(lái)說(shuō)明那兩組數(shù)據(jù)的相關(guān)性最高。要衡量和對(duì)比相關(guān)性的密切程度德撬,就需要使用下一個(gè)方法:相關(guān)系數(shù)铲咨。
線性相關(guān)系數(shù)
也叫Pearson相關(guān)系數(shù), 主要衡量?jī)蓚€(gè)變量線性相關(guān)的程度蜓洪。
r=cov(X,Y)/(D(X)D(Y))
相關(guān)系數(shù)是用協(xié)方差除以兩個(gè)隨機(jī)變量的標(biāo)準(zhǔn)差纤勒。相關(guān)系數(shù)的大小在-1和1之間變化。再也不會(huì)出現(xiàn)因?yàn)橛?jì)量單位變化隆檀,而數(shù)值暴漲的情況了摇天。
線性相關(guān)系數(shù)必須建立在因變量與自變量是線性的關(guān)系基礎(chǔ)上粹湃,否則線性相關(guān)系數(shù)是無(wú)意義的。
- 連續(xù)與離散變量之間的相關(guān)性
(方差分析計(jì)算關(guān)系強(qiáng)度R2泉坐,判別離散變量是否對(duì)連續(xù)變量有顯著影響)
連續(xù)變量離散化
將連續(xù)變量離散化为鳄,然后,使用離散與離散變量相關(guān)性分析的方法來(lái)分析相關(guān)性坚冀。
箱形圖
使用畫箱形圖的方法济赎,看離散變量取不同值,連續(xù)變量的均值與方差及取值分布情況记某。
如果,離散變量取不同值构捡,對(duì)應(yīng)的連續(xù)變量的箱形圖差別不大液南,則說(shuō)明,離散變量取不同值對(duì)連續(xù)變量的影響不大勾徽,相關(guān)性不高;反之滑凉,相關(guān)性高。
代碼參考了kaggle的一個(gè)優(yōu)秀答案
def categorical_factor_with_independ_factor(train, independ_factor, var):
data = pd.concat([train[independ_factor], train[var]], axis=1)
f, ax = plt.subplots(figsize=(8, 6))
fig = sns.boxplot(x=var, y=independ_factor, data=data)
fig.axis(ymin=0, ymax=800000)
plt.xticks(rotation=60);
return
- 特殊的相關(guān)性分析
kendall相關(guān)系數(shù)
kendall相關(guān)系數(shù)也稱為和諧系數(shù)喘帚,是一種等級(jí)相關(guān)的相關(guān)性分析方法畅姊。之所以放在特殊類型,是因?yàn)椴粌H要求變量是兩個(gè)離散變量而且還要求這兩個(gè)變量為有序的吹由。所以我選擇把他單獨(dú)放在一類若未。
此相關(guān)系數(shù)適用于兩個(gè)隨機(jī)變量都為等級(jí)性質(zhì)的變量蒋譬,例如磷斧,評(píng)分等級(jí),質(zhì)量等級(jí)等符合一定線性邏輯幅垮,并且是等級(jí)性質(zhì)的(并且其中的等級(jí)劃分區(qū)域最好不要相差太大)乌昔。
二隙疚、多重共線性的檢測(cè)和解決辦法
數(shù)據(jù)預(yù)處理系列:多重共線性_檢測(cè)和解決辦法-CSDN博客
多重共線性簡(jiǎn)介(Collinearity and Multicollinearity)
多重共線性(Collinearity)指的是預(yù)測(cè)變量,也稱為自變量磕道,彼此之間并不是完全獨(dú)立的供屉。
共線性是指兩個(gè)特征之間存在線性關(guān)系(高度相關(guān)),并且它們被用作目標(biāo)的預(yù)測(cè)變量溺蕉。通常使用皮爾遜相關(guān)系數(shù)來(lái)衡量伶丐。多于兩個(gè)預(yù)測(cè)變量之間也可能存在共線性(并且通常是這種情況)。
多重共線性這個(gè)術(shù)語(yǔ)最初是由Ragnar Frisch提出的焙贷。多重共線性是共線性的一種特殊情況撵割,其中一個(gè)特征與兩個(gè)或更多特征呈線性關(guān)系。我們也可能出現(xiàn)這樣的情況:多于兩個(gè)特征之間存在相關(guān)性辙芍,但同時(shí)它們之間沒(méi)有高度相關(guān)性啡彬。
在多元回歸中羹与,部分多重共線性是普遍存在的。兩個(gè)隨機(jī)變量在樣本中幾乎總是會(huì)在某種程度上相關(guān)庶灿,即使它們?cè)诟蟮目傮w中沒(méi)有任何基本關(guān)系纵搁。換句話說(shuō),多重共線性是一個(gè)程度問(wèn)題往踢。
1. 多重共線性的后果
多重共線性可能在模型擬合過(guò)程中導(dǎo)致重大問(wèn)題腾誉。它會(huì)降低回歸和分類模型的整體性能:
- 不會(huì)增加偏差,但可能會(huì)增加方差(過(guò)擬合)峻呕;
- 使估計(jì)值對(duì)模型中的微小變化非常敏感利职;
- 不會(huì)影響預(yù)測(cè)能力,但可能會(huì)錯(cuò)誤地計(jì)算出各個(gè)預(yù)測(cè)變量對(duì)響應(yīng)變量的影響瘦癌。
結(jié)果是猪贪,系數(shù)估計(jì)值不穩(wěn)定且難以解釋。多重共線性削弱了分析的統(tǒng)計(jì)功效讯私,可能導(dǎo)致系數(shù)改變符號(hào)热押,并且使得正確指定模型更加困難。
2. 處理多重共線性問(wèn)題的方法
- 增加樣本量斤寇。增加樣本量會(huì)引入更多的數(shù)據(jù)序列變化桶癣,從而減少抽樣誤差的影響,并在估計(jì)數(shù)據(jù)的各種屬性時(shí)提高精確度娘锁。增加樣本量可以減少多重共線性的存在或影響牙寞,或者兩者都可以減少。
- 刪除一些高度相關(guān)的特征致盟。
- 手動(dòng)方法 - 方差膨脹因子(VIF)
- 自動(dòng)方法 - 遞歸特征消除(RFE)
- 使用PCA分解進(jìn)行特征消除(在本研究中將跳過(guò)此方法)
- 用它們的線性組合替換高度相關(guān)的回歸變量碎税。
- 在特征工程中保持常識(shí) - 理解自己在做什么。
- 使用正則化方法馏锡,如嶺回歸(RIDGE)和套索回歸(LASSO)或貝葉斯回歸雷蹂。
數(shù)據(jù)和python庫(kù)設(shè)置
# 導(dǎo)入必要的庫(kù)
import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
from statsmodels.stats.outliers_influence import variance_inflation_factor
from sklearn.model_selection import cross_val_score
from sklearn import metrics
from collections import Counter
# 在jupyter notebook中顯示圖形
%matplotlib inline
1. 數(shù)據(jù)集特征
波士頓房?jī)r(jià)
https://www.kaggle.com/datasets/vikrishnan/boston-house-prices
這是UCI ML房屋數(shù)據(jù)集的副本。
https://archive.ics.uci.edu/ml/machine-learning-databases/housing/
BMI 數(shù)據(jù)集
https://www.kaggle.com/datasets/yasserh/bmidataset
2. 導(dǎo)入數(shù)據(jù)
# 定義列名
column_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
# 讀取波士頓房?jī)r(jià)數(shù)據(jù)集
raw_boston = pd.read_csv('../input/boston-house-prices/housing.csv', header=None, delimiter=r"\s+", names=column_names)
# 讀取BMI數(shù)據(jù)集
raw_bmi = pd.read_csv('../input/bmidataset/bmi.csv')
# 創(chuàng)建一個(gè)名為"Gender"的新列杯道,用于存儲(chǔ)性別的虛擬變量
# 將"Gender"列中的"Male"替換為0匪煌,"Female"替換為1,以創(chuàng)建性別的虛擬變量
raw_bmi['Gender'] = raw_bmi['Gender'].map({'Male':0, 'Female':1})
相關(guān)矩陣
相關(guān)矩陣給出了兩個(gè)獨(dú)立變量之間的成對(duì)相關(guān)性或雙變量關(guān)系 - 共線性党巾。它是一個(gè)顯示不同變量之間相關(guān)系數(shù)的表格萎庭。它接受具有數(shù)值列的輸入關(guān)系,并計(jì)算其輸入列之間的皮爾遜相關(guān)系數(shù)齿拂。
該矩陣顯示了表格中所有可能值對(duì)之間的相關(guān)性驳规。它是總結(jié)大型數(shù)據(jù)集并識(shí)別和可視化給定數(shù)據(jù)中的模式的強(qiáng)大工具。如果相關(guān)矩陣顯示出具有高絕對(duì)值的元素署海,我們可以談?wù)摴簿€性吗购。在極端情況下医男,解釋變量完全重疊。
### 繪制各列之間的相關(guān)性熱力圖
plt.figure(figsize = (6, 6)) # 創(chuàng)建一個(gè)6x6的圖像窗口
# 使用sns.heatmap函數(shù)繪制熱力圖捻勉,傳入數(shù)據(jù)為raw_bmi的相關(guān)性矩陣镀梭,vmin和vmax參數(shù)指定顏色映射的范圍為-1到1,
# annot參數(shù)為True表示在熱力圖上顯示相關(guān)系數(shù)的數(shù)值
heatmap = sns.heatmap(raw_bmi.corr(), vmin = -1, vmax = 1, annot = True)
# 設(shè)置熱力圖的標(biāo)題為'BMI Correlation Heatmap'踱启,字體大小為18报账,標(biāo)題與圖像之間的間距為12像素
heatmap.set_title('BMI Correlation Heatmap', fontdict = {'fontsize' : 18}, pad = 12)
Text(0.5, 1.0, 'BMI Correlation Heatmap')
我們可以看到“指數(shù)”和“身高”/“體重”之間存在很強(qiáng)的相關(guān)性(如預(yù)期所示)。
我們還可以注意到埠偿,“體重”對(duì)“指數(shù)”的影響要比“身高”大得多透罢。這也是直觀和預(yù)期的。
### 繪制各列之間的相關(guān)性熱力圖
plt.figure(figsize = (13, 13)) # 創(chuàng)建一個(gè)大小為13x13的圖像畫布
# 使用seaborn庫(kù)的heatmap函數(shù)繪制熱力圖冠蒋,傳入數(shù)據(jù)為raw_boston的相關(guān)性矩陣琐凭,設(shè)置顏色映射范圍為-1到1,同時(shí)在圖中顯示相關(guān)系數(shù)的數(shù)值
heatmap = sns.heatmap(raw_boston.corr(), vmin = -1, vmax = 1, annot = True)
# 設(shè)置熱力圖的標(biāo)題為'Boston Correlation Heatmap'浊服,設(shè)置標(biāo)題的字體大小為18,設(shè)置標(biāo)題與圖像之間的距離為12像素
heatmap.set_title('Boston Correlation Heatmap', fontdict = {'fontsize' : 18}, pad = 12)
Text(0.5, 1.0, 'Boston Correlation Heatmap')
1. 聚類圖
聚類圖表不僅顯示了變量之間的所有相關(guān)性胚吁,還顯示了它們之間的分組(聚類)關(guān)系牙躺。
# 設(shè)置繪圖大小
plt.figure(figsize = (4, 4))
# 使用Seaborn庫(kù)的clustermap函數(shù)繪制聚類熱力圖
# raw_boston.corr()計(jì)算Boston房?jī)r(jià)數(shù)據(jù)集中各變量之間的相關(guān)系數(shù)矩陣
# vmin和vmax分別設(shè)置熱力圖顏色條的最小值和最大值
# annot=True表示在熱力圖上顯示相關(guān)系數(shù)數(shù)值
clustermap = sns.clustermap(raw_boston.corr(), vmin = -1, vmax = 1, annot = True)
方差膨脹因子
方差膨脹因子(VIF)是回歸分析中多重共線性程度的衡量指標(biāo)。VIF用于確定一個(gè)自變量與一組其他變量之間的相關(guān)性腕扶。
在回歸分析中孽拷,當(dāng)兩個(gè)或更多的變量之間存在線性關(guān)系時(shí),存在多重共線性半抱。VIF通過(guò)衡量給定回歸變量與其他回歸變量的線性相關(guān)性脓恕,增加了其系數(shù)估計(jì)的方差,相對(duì)于沒(méi)有相關(guān)性的基準(zhǔn)情況窿侈。
VIF告訴我們預(yù)測(cè)變量之間的相關(guān)性如何膨脹方差炼幔。例如,VIF為10表示現(xiàn)有的多重共線性使系數(shù)的方差相對(duì)于沒(méi)有多重共線性模型增加了10倍史简。
VIF沒(méi)有任何上限乃秀。數(shù)值越低越好。大于4或5的值有時(shí)被認(rèn)為是中度到高度的圆兵,而大于10的值被認(rèn)為是非常高的跺讯。
因此,通常將VIF = 5作為閾值殉农。這意味著任何大于5的自變量都必須被移除刀脏。盡管理想的閾值取決于具體情況,在許多計(jì)量經(jīng)濟(jì)學(xué)教科書中超凳,只有當(dāng)VIF > 10時(shí)才被認(rèn)為是嚴(yán)重的多重共線性愈污。
1. 兩種多重共線性
基于數(shù)據(jù)的多重共線性:這種類型的多重共線性存在于數(shù)據(jù)本身中耀态。觀察性實(shí)驗(yàn)更有可能展現(xiàn)這種類型的多重共線性。
例如:兩個(gè)相同(或幾乎相同)的變量钙畔。磅重和公斤重茫陆,或者投資收入和儲(chǔ)蓄/債券收入。
結(jié)構(gòu)性多重共線性:由研究人員創(chuàng)建新的預(yù)測(cè)變量引起擎析。當(dāng)我們使用其他術(shù)語(yǔ)創(chuàng)建模型術(shù)語(yǔ)時(shí)簿盅,就會(huì)出現(xiàn)這種類型。換句話說(shuō)揍魂,它是我們指定的模型的副產(chǎn)品桨醋。
在回歸中包括一個(gè)實(shí)際上是兩個(gè)其他變量的組合的變量。例如现斋,在回歸中包括“總投資收入”喜最,而總投資收入=股票和債券收入+儲(chǔ)蓄利息收入。
2. 基于數(shù)據(jù)的多重共線性
讓我們使用3個(gè)特征:‘性別’庄蹋、‘身高’和’體重’瞬内,來(lái)檢查一個(gè)BMI數(shù)據(jù)庫(kù)的VIF。
# 導(dǎo)入必要的庫(kù)已經(jīng)完成限书,不再贅述
# 定義自變量集合
X = raw_bmi[['Gender', 'Height', 'Weight']]
# 創(chuàng)建一個(gè)空的VIF數(shù)據(jù)框
vif_data = pd.DataFrame()
# 將自變量的名稱添加到VIF數(shù)據(jù)框中
vif_data["Feature"] = X.columns
# 計(jì)算每個(gè)自變量的VIF值
vif_data["VIF"] = [variance_inflation_factor(X.values, i)
for i in range(len(X.columns))]
# 打印VIF數(shù)據(jù)框
print(vif_data)
‘Height’ 和 ‘Weight’ 的VIF值很高虫蝶,表明這兩個(gè)變量高度相關(guān)。這是可以預(yù)期的倦西,因?yàn)橐粋€(gè)人的身高確實(shí)會(huì)影響他們的體重能真。因此,考慮這兩個(gè)特征仍然會(huì)導(dǎo)致一個(gè)具有高多重共線性的模型扰柠。
3. 結(jié)構(gòu)性多重共線性
現(xiàn)在讓我們使用4個(gè)特征:‘Gender’粉铐、‘Height’、‘Weight’和’Index’卤档,來(lái)檢查BMI數(shù)據(jù)庫(kù)的VIF蝙泼。
# 定義語(yǔ)料
# 獨(dú)立變量集
X = raw_bmi[['Gender', 'Height', 'Weight', 'Index']]
# 創(chuàng)建一個(gè)空的VIF數(shù)據(jù)框
vif_data = pd.DataFrame()
# 在VIF數(shù)據(jù)框中添加特征列
vif_data["Feature"] = X.columns
# 計(jì)算每個(gè)特征的VIF
vif_data["VIF"] = [variance_inflation_factor(X.values, i)
for i in range(len(X.columns))]
# 打印VIF數(shù)據(jù)框
print(vif_data)
有一個(gè)顯著的差異!'Weight’的VIF值大于40裆装,'Index’的VIF值大于25踱承!
我知道在數(shù)據(jù)集中有’Index’,但請(qǐng)思考一下’Index’實(shí)際代表什么哨免。我們可以將其視為其他特征的派生特征茎活。在特征工程中創(chuàng)建這樣的新特征非常常見(jiàn)。
無(wú)論如何琢唾,我們可以將其視為研究人員創(chuàng)造的多重共線性的一個(gè)很好的例子载荔。
基于VIF的特征降維
讓我們使用VIF檢查波士頓數(shù)據(jù)框中的多重共線性。
# 導(dǎo)入所需的庫(kù)
# 從raw_boston數(shù)據(jù)集中選擇獨(dú)立變量集合采桃,存儲(chǔ)在X2中
X2 = raw_boston[['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']]
# 創(chuàng)建一個(gè)空的DataFrame懒熙,用于存儲(chǔ)VIF值
vif2_data = pd.DataFrame()
# 在vif2_data中創(chuàng)建一個(gè)名為"Feature"的列丘损,用于存儲(chǔ)特征名稱
vif2_data["Feature"] = X2.columns
# 計(jì)算每個(gè)特征的VIF值,并將結(jié)果存儲(chǔ)在vif2_data的"VIF"列中
vif2_data["VIF"] = [variance_inflation_factor(X2.values, i)
for i in range(len(X2.columns))]
# 打印vif2_data工扎,顯示每個(gè)特征的VIF值
print(vif2_data)
我們這里有一些很大的VIF值徘钥!讓我們?cè)诮酉聛?lái)的步驟中刪除一些高度相關(guān)的特征。
重要提示:我們應(yīng)該逐步進(jìn)行肢娘,一次刪除一個(gè)特征并檢查結(jié)果呈础。
# 定義自變量集合
X2 = raw_boston[['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'B', 'LSTAT']]
# 創(chuàng)建一個(gè)空的DataFrame用于存儲(chǔ)VIF值
vif2_data = pd.DataFrame()
# 將特征列添加到DataFrame中
vif2_data["Feature"] = X2.columns
# 計(jì)算每個(gè)特征的VIF值
vif2_data["VIF"] = [variance_inflation_factor(X2.values, i)
for i in range(len(X2.columns))]
# 打印VIF值的DataFrame
print(vif2_data)
在僅刪除PTRATIO之后,VIF值發(fā)生了顯著變化橱健!但是其他特征仍然具有較高的VIF值而钞。
讓我們進(jìn)一步刪除更多的特征,直到所有特征的VIF值都低于10拘荡。
我不會(huì)在這里展示所有的步驟 - 你可以自己查看臼节。
最后一步需要7個(gè)特征。
# 定義自變量集合
X2 = raw_boston[['CRIM', 'ZN', 'INDUS', 'CHAS', 'DIS', 'RAD', 'LSTAT']]
# 創(chuàng)建一個(gè)空的DataFrame用于存儲(chǔ)VIF值
vif2_data = pd.DataFrame()
# 將自變量的名稱存儲(chǔ)在DataFrame的"Feature"列中
vif2_data["Feature"] = X2.columns
# 計(jì)算每個(gè)自變量的VIF值
vif2_data["VIF"] = [variance_inflation_factor(X2.values, i)
for i in range(len(X2.columns))]
# 打印VIF值的DataFrame
print(vif2_data)
現(xiàn)在我們已經(jīng)擁有所有VIF值小于10的特征珊皿。
在接下來(lái)的步驟中网缝,我們將比較包含所有特征的線性回歸模型與使用VIF刪除特征后的模型。
回歸模型性能比較
1. 數(shù)據(jù)預(yù)處理
# 將原始波士頓數(shù)據(jù)集復(fù)制到新的變量scaled_boston中蟋定,以便進(jìn)行縮放處理途凫。
scaled_boston = raw_boston.copy()
# 導(dǎo)入StandardScaler類
from sklearn.preprocessing import StandardScaler
# 定義特征列名
col_names = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']
# 從scaled_boston中提取特征數(shù)據(jù)
features = scaled_boston[col_names]
# 創(chuàng)建StandardScaler對(duì)象,并使用特征數(shù)據(jù)進(jìn)行擬合
scaler = StandardScaler().fit(features.values)
# 使用擬合后的scaler對(duì)特征數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理
features = scaler.transform(features.values)
# 將標(biāo)準(zhǔn)化后的特征數(shù)據(jù)更新到scaled_boston中
scaled_boston[col_names] = features
# 提取特征變量X和目標(biāo)變量y
X = scaled_boston.iloc[:, :-1].values
y = scaled_boston.iloc[:, -1].values
# X是特征變量溢吻,包含所有行和除最后一列之外的所有列
# y是目標(biāo)變量,包含所有行和最后一列的值
2. 回歸評(píng)估指標(biāo)
- 平均絕對(duì)誤差(MAE)是誤差絕對(duì)值的平均值:
平均絕對(duì)誤差表示數(shù)據(jù)集中實(shí)際值和預(yù)測(cè)值之間絕對(duì)差異的平均值果元。它衡量數(shù)據(jù)集中殘差的平均值促王。 - 均方誤差(MSE)是誤差平方的平均值
均方誤差表示數(shù)據(jù)集中原始值和預(yù)測(cè)值之間平方差的平均值。它衡量殘差的方差而晒。MSE 由于MSE“懲罰”較大的誤差蝇狼,在現(xiàn)實(shí)世界中往往很有用。 - 均方根誤差(RMSE)是均方誤差的平方根
均方根誤差是均方誤差的平方根倡怎。它衡量殘差的標(biāo)準(zhǔn)差迅耘。RMSE 在“y”單位中是可解釋的。
R平方 決定系數(shù)或R平方表示因變量方差中由線性回歸模型解釋的比例监署。當(dāng)R2較高時(shí)颤专,表示回歸可以捕捉觀察到的因變量的大部分變異。因此钠乏,當(dāng)R2較高時(shí)栖秕,我們可以說(shuō)回歸模型的性能較好。
調(diào)整R平方 是R平方的修改版本晓避,它根據(jù)模型中的獨(dú)立變量數(shù)量進(jìn)行了調(diào)整簇捍,并且始終小于或等于R2只壳。在下面的公式中,n是數(shù)據(jù)中的觀測(cè)數(shù)暑塑,k是數(shù)據(jù)中的獨(dú)立變量數(shù)吼句。
RMSE和R平方都量化了線性回歸模型擬合數(shù)據(jù)集的程度。在評(píng)估模型擬合數(shù)據(jù)集的程度時(shí)事格,計(jì)算RMSE和R2值是有用的惕艳,因?yàn)槊總€(gè)指標(biāo)都告訴我們不同的信息。
RMSE告訴我們回歸模型預(yù)測(cè)值與實(shí)際值之間的典型距離分蓖。
R2告訴我們預(yù)測(cè)變量能夠解釋響應(yīng)變量的變異程度尔艇。
向回歸模型添加更多的獨(dú)立變量或預(yù)測(cè)變量往往會(huì)增加R2值,這會(huì)引誘模型制作者添加更多的變量么鹤。調(diào)整R2用于確定相關(guān)性的可靠性以及它受獨(dú)立變量添加的影響程度终娃。它始終低于R2。
我們將使用的最后一個(gè)指標(biāo)是交叉驗(yàn)證的R2蒸甜。
交叉驗(yàn)證是一種用于評(píng)估機(jī)器學(xué)習(xí)模型的重采樣過(guò)程,用于有限的數(shù)據(jù)樣本柠新。
交叉驗(yàn)證是一種流行的方法窍荧,因?yàn)樗?jiǎn)單易懂,并且通常會(huì)得出比其他方法(如簡(jiǎn)單的訓(xùn)練/測(cè)試拆分)更少偏差或樂(lè)觀估計(jì)的模型技能恨憎。
線性回歸
# 使用train_test_split函數(shù)將數(shù)據(jù)集劃分為訓(xùn)練集和測(cè)試集
# 參數(shù)X表示特征數(shù)據(jù)集蕊退,y表示目標(biāo)數(shù)據(jù)集
# 參數(shù)test_size表示測(cè)試集所占比例,這里設(shè)置為0.3憔恳,即測(cè)試集占總數(shù)據(jù)集的30%
# 參數(shù)random_state表示隨機(jī)種子瓤荔,這里設(shè)置為42,保證每次劃分的結(jié)果一致
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42)
# 導(dǎo)入LinearRegression線性回歸模型
# 創(chuàng)建并訓(xùn)練模型
lm = LinearRegression() # 創(chuàng)建一個(gè)線性回歸模型對(duì)象
lm.fit(X_train, y_train) # 使用訓(xùn)練數(shù)據(jù)對(duì)模型進(jìn)行訓(xùn)練
# 模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
y_pred = lm.predict(X_test) # 使用訓(xùn)練好的模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)钥组,得到預(yù)測(cè)結(jié)果y_pred
# 預(yù)測(cè)交叉驗(yàn)證分?jǐn)?shù)
cv_lm = cross_val_score(estimator=lm, X=X_train, y=y_train, cv=10)
# 計(jì)算調(diào)整后的R-squared
r2 = lm.score(X_test, y_test)
# 觀測(cè)值的數(shù)量是沿著軸0的形狀
n = X_test.shape[0]
# 特征的數(shù)量(預(yù)測(cè)變量输硝,p)是沿著軸1的形狀
p = X_test.shape[1]
# 調(diào)整后的R-squared公式
lm_adjusted_r2 = 1 - (1 - r2) * (n - 1) / (n - p - 1)
lm_RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))
lm_R2 = lm.score(X_test, y_test)
lmCV_R2 = cv_lm.mean()
print('RMSE:', round(np.sqrt(metrics.mean_squared_error(y_test, y_pred)), 4))
print('R2:', round(lm.score(X_test, y_test), 4))
print('Adjusted R2:', round(lm_adjusted_r2, 4))
print("Cross Validated R2: ", round(cv_lm.mean(), 4))
# 設(shè)置圖形的大小
plt.figure(figsize=(10, 5))
# 繪制回歸圖
sns.regplot(x=y_test, y=y_pred)
# 設(shè)置圖形的標(biāo)題和字體大小
plt.title('Linear regression with all features', fontsize=20)
Text(0.5, 1.0, 'Linear regression with all features')
隨機(jī)森林
# 導(dǎo)入RandomForestRegressor類
from sklearn.ensemble import RandomForestRegressor
# 創(chuàng)建和訓(xùn)練模型
# 創(chuàng)建一個(gè)隨機(jī)森林回歸模型,包含10個(gè)決策樹程梦,隨機(jī)種子為0
RandomForest_reg = RandomForestRegressor(n_estimators = 10, random_state = 0)
RandomForest_reg.fit(X_train, y_train) # 使用訓(xùn)練數(shù)據(jù)集X_train和y_train來(lái)訓(xùn)練模型
# 模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
y_pred = RandomForest_reg.predict(X_test) # 使用訓(xùn)練好的模型對(duì)測(cè)試數(shù)據(jù)集X_test進(jìn)行預(yù)測(cè)点把,預(yù)測(cè)結(jié)果存儲(chǔ)在y_pred中
# 預(yù)測(cè)交叉驗(yàn)證分?jǐn)?shù)
cv_rf = cross_val_score(estimator=RandomForest_reg, X=X_train, y=y_train, cv=10)
# 計(jì)算調(diào)整后的R平方
r2 = RandomForest_reg.score(X_test, y_test)
# 觀測(cè)值的數(shù)量是沿著軸0的形狀
n = X_test.shape[0]
# 特征的數(shù)量(預(yù)測(cè)變量,p)是沿著軸1的形狀
p = X_test.shape[1]
# 調(diào)整后的R平方公式
rf_adjusted_r2 = 1 - (1 - r2) * (n - 1) / (n - p - 1)
rf_RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))
rf_R2 = RandomForest_reg.score(X_test, y_test)
rfCV_R2 = cv_rf.mean()
print('RMSE:', round(np.sqrt(metrics.mean_squared_error(y_test, y_pred)), 4))
print('R2:', round(RandomForest_reg.score(X_test, y_test), 4))
print('Adjusted R2:', round(rf_adjusted_r2, 4))
print("Cross Validated R2: ", round(cv_rf.mean(), 4))
使用VIF刪除特征后的線性回歸
# 復(fù)制scaled_boston數(shù)據(jù)集并將其命名為scaled_boston2
scaled_boston2 = scaled_boston.copy()
# 從scaled_boston2數(shù)據(jù)集中刪除'NOX', 'RM', 'AGE', 'TAX', 'PTRATIO', 'B'這些列
scaled_boston2 = scaled_boston2.drop(['NOX', 'RM', 'AGE', 'TAX', 'PTRATIO', 'B'], axis=1)
# 提取特征變量X
X = scaled_boston2.iloc[:, :-1].values
# 提取目標(biāo)變量y
y = scaled_boston2.iloc[:, -1].values
# 使用train_test_split函數(shù)將數(shù)據(jù)集分割為訓(xùn)練集和測(cè)試集
# 參數(shù)X為特征數(shù)據(jù)屿附,y為目標(biāo)數(shù)據(jù)
# test_size表示測(cè)試集占總數(shù)據(jù)集的比例郎逃,這里設(shè)置為0.3,即測(cè)試集占總數(shù)據(jù)集的30%
# random_state用于設(shè)置隨機(jī)種子挺份,保證每次運(yùn)行代碼得到的結(jié)果一致
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42)
# 創(chuàng)建一個(gè)線性回歸模型對(duì)象
lm2 = LinearRegression()
# 使用訓(xùn)練數(shù)據(jù)來(lái)訓(xùn)練線性回歸模型
lm2.fit(X_train, y_train)
# 使用訓(xùn)練好的模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
y_pred = lm2.predict(X_test)
# 設(shè)置圖形的大小為10x5
plt.figure(figsize=(10, 5))
# 繪制回歸圖衣厘,x軸為y_test,y軸為y_pred
sns.regplot(x=y_test, y=y_pred)
# 設(shè)置圖形的標(biāo)題為'Linear regression after dropping features',字體大小為20
plt.title('Linear regression after dropping features', fontsize=20)
Text(0.5, 1.0, 'Linear regression after dropping features')
# 預(yù)測(cè)交叉驗(yàn)證分?jǐn)?shù)
cv_lm2 = cross_val_score(estimator=lm2, X=X_train, y=y_train, cv=10)
# 計(jì)算調(diào)整后的R平方
r2 = lm2.score(X_test, y_test)
# 觀測(cè)值的數(shù)量是沿著軸0的形狀
n = X_test.shape[0]
# 特征的數(shù)量(預(yù)測(cè)變量影暴,p)是沿著軸1的形狀
p = X_test.shape[1]
# 調(diào)整后的R平方公式
lm2_adjusted_r2 = 1 - (1 - r2) * (n - 1) / (n - p - 1)
lm2_RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))
lm2_R2 = lm2.score(X_test, y_test)
lm2CV_R2 = cv_lm2.mean()
print('RMSE:', round(np.sqrt(metrics.mean_squared_error(y_test, y_pred)), 4))
print('R2:', round(lm2.score(X_test, y_test), 4))
print('Adjusted R2:', round(lm2_adjusted_r2, 4))
print("Cross Validated R2: ", round(cv_lm2.mean(), 4))
如我們所見(jiàn) - 結(jié)果看起來(lái)并不好错邦!我們稍后會(huì)討論這個(gè)問(wèn)題。
使用VIF方法刪除特征后的隨機(jī)森林模型
# 創(chuàng)建和訓(xùn)練模型
RandomForest2_reg = RandomForestRegressor(n_estimators = 10, random_state = 0)
# 使用隨機(jī)森林回歸器模型型宙,設(shè)置10個(gè)決策樹撬呢,隨機(jī)種子為0
RandomForest2_reg.fit(X_train, y_train)
# 使用訓(xùn)練好的模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
y_pred = RandomForest2_reg.predict(X_test)
# 預(yù)測(cè)交叉驗(yàn)證分?jǐn)?shù)
cv_rf2 = cross_val_score(estimator=RandomForest2_reg, X=X_train, y=y_train, cv=10)
# 計(jì)算調(diào)整后的R平方
r2 = RandomForest2_reg.score(X_test, y_test)
# 觀測(cè)值數(shù)量是沿著軸0的形狀
n = X_test.shape[0]
# 特征數(shù)量(預(yù)測(cè)變量,p)是沿著軸1的形狀
p = X_test.shape[1]
# 調(diào)整后的R平方公式
rf2_adjusted_r2 = 1 - (1 - r2) * (n - 1) / (n - p - 1)
rf2_RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))
rf2_R2 = RandomForest2_reg.score(X_test, y_test)
rf2CV_R2 = cv_rf2.mean()
print('RMSE:', round(np.sqrt(metrics.mean_squared_error(y_test, y_pred)), 4))
print('R2:', round(RandomForest2_reg.score(X_test, y_test), 4))
print('Adjusted R2:', round(rf2_adjusted_r2, 4))
print("Cross Validated R2: ", round(cv_rf2.mean(), 4))
再一次妆兑。在刪除特征之后魂拦,我們的結(jié)果比之前更差。
遞歸特征消除(RFE)
遞歸特征消除(RFE)是一種通過(guò)遞歸地考慮特征子集來(lái)選擇特征的方法搁嗓。它通過(guò)反復(fù)構(gòu)建模型并選擇最佳或最差的特征(根據(jù)模型的性能)來(lái)實(shí)現(xiàn)芯勘。在每次迭代中,它會(huì)將最佳或最差的特征從特征集中移除腺逛,然后繼續(xù)迭代荷愕,直到達(dá)到預(yù)設(shè)的特征數(shù)量。
RFE的主要思想是通過(guò)遞歸地消除特征棍矛,來(lái)選擇最佳的特征子集安疗。它可以用于特征選擇和特征排名。在每次迭代中够委,它會(huì)根據(jù)模型的性能選擇最佳或最差的特征荐类,并將其從特征集中移除。然后茁帽,它會(huì)繼續(xù)迭代,直到達(dá)到預(yù)設(shè)的特征數(shù)量潘拨。
RFE的步驟如下:
- 選擇一個(gè)機(jī)器學(xué)習(xí)模型作為基礎(chǔ)模型厌小。
- 根據(jù)模型的性能選擇最佳或最差的特征。
- 將選擇的特征從特征集中移除战秋。
- 重復(fù)步驟2和3,直到達(dá)到預(yù)設(shè)的特征數(shù)量讨韭。
RFE的優(yōu)點(diǎn)包括:
- 可以自動(dòng)選擇特征子集脂信,無(wú)需手動(dòng)選擇。
- 可以通過(guò)遞歸地消除特征來(lái)選擇最佳的特征子集透硝。
然而狰闪,RFE也有一些限制:
- 如果特征之間存在高度相關(guān)性,RFE可能會(huì)選擇其中一個(gè)特征濒生,而忽略其他相關(guān)特征埋泵。
- RFE的計(jì)算成本較高,特別是在特征數(shù)量較多的情況下。
總之丽声,遞歸特征消除(RFE)是一種通過(guò)遞歸地考慮特征子集來(lái)選擇特征的方法礁蔗。它可以用于特征選擇和特征排名,但也有一些限制雁社。
遞歸特征消除(RFE)是一種向后特征選擇算法浴井。
該算法通過(guò)多次擬合模型并在每一步中根據(jù)擬合模型的coef_或feature_importances_屬性刪除最弱的特征,從而從模型中消除n個(gè)特征霉撵。
RFE通過(guò)從訓(xùn)練數(shù)據(jù)集中的所有特征開(kāi)始磺浙,成功刪除特征直到剩下所需數(shù)量的特征來(lái)搜索特征子集。
RFE是一種包裝型特征選擇算法徒坡。這意味著在方法的核心中給定并使用了不同的機(jī)器學(xué)習(xí)算法撕氧,由RFE包裝,并用于幫助選擇特征喇完。
并非所有模型都可以與RFE方法配對(duì)伦泥,有些模型比其他模型更受益于RFE。因?yàn)镽FE要求初始模型使用完整的預(yù)測(cè)變量集何暮,所以當(dāng)預(yù)測(cè)變量的數(shù)量超過(guò)樣本數(shù)量時(shí)奄喂,某些模型無(wú)法使用。這些模型包括多元線性回歸海洼、邏輯回歸和線性判別分析跨新。如果我們希望將其中一種技術(shù)與RFE一起使用,則必須首先縮小預(yù)測(cè)變量的范圍坏逢。此外域帐,某些模型比其他模型更受益于使用RFE。隨機(jī)森林就是這樣一個(gè)模型(Svetnik等人是整,2003)肖揣。
向后選擇經(jīng)常與隨機(jī)森林模型一起使用,原因有兩個(gè):
- 隨機(jī)森林傾向于不排除預(yù)測(cè)方程中的變量浮入;
- 它有一種內(nèi)部方法來(lái)衡量特征重要性龙优。
# 提取特征變量X和目標(biāo)變量y
X = scaled_boston.iloc[:, :-1].values
y = scaled_boston.iloc[:, -1].values
# X為特征變量,去除最后一列
# y為目標(biāo)變量事秀,只包含最后一列的值
# 使用train_test_split函數(shù)將數(shù)據(jù)集分為訓(xùn)練集和測(cè)試集
# 參數(shù)X為特征數(shù)據(jù)彤断,y為目標(biāo)數(shù)據(jù)
# test_size表示測(cè)試集所占的比例,這里設(shè)置為0.3易迹,即測(cè)試集占總數(shù)據(jù)集的30%
# random_state表示隨機(jī)種子宰衙,這里設(shè)置為42,保證每次運(yùn)行代碼得到的結(jié)果一致
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42)
# 導(dǎo)入所需的庫(kù)
from sklearn.feature_selection import RFE
from sklearn.pipeline import Pipeline
# 創(chuàng)建一個(gè)Pipeline對(duì)象
# 使用RFE進(jìn)行特征選擇睹欲,選擇8個(gè)特征
rfe = RFE(estimator=RandomForestRegressor(), n_features_to_select=8)
# 創(chuàng)建一個(gè)隨機(jī)森林回歸模型
model = RandomForestRegressor()
# 創(chuàng)建一個(gè)Pipeline對(duì)象供炼,將特征選擇和回歸模型組合在一起
rf_pipeline = Pipeline(steps=[('s',rfe),('m',model)])
# 使用訓(xùn)練數(shù)據(jù)進(jìn)行模型訓(xùn)練
rf_pipeline.fit(X_train, y_train)
# 使用訓(xùn)練好的模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
y_pred = rf_pipeline.predict(X_test)
# 預(yù)測(cè)交叉驗(yàn)證分?jǐn)?shù)
cv_rf_pipeline = cross_val_score(estimator=rf_pipeline, X=X_train, y=y_train, cv=10)
# 計(jì)算調(diào)整后的R平方
r2 = rf_pipeline.score(X_test, y_test)
# 觀測(cè)值的數(shù)量是沿著軸0的形狀
n = X_test.shape[0]
# 特征的數(shù)量(預(yù)測(cè)變量一屋,p)是沿著軸1的形狀
p = X_test.shape[1]
# 調(diào)整后的R平方公式
rf_pipeline_adjusted_r2 = 1 - (1 - r2) * (n - 1) / (n - p - 1)
rf_pipeline_RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))
rf_pipeline_R2 = rf_pipeline.score(X_test, y_test)
rf_pipelineCV_R2 = cv_rf_pipeline.mean()
print('RMSE:', round(np.sqrt(metrics.mean_squared_error(y_test, y_pred)), 4))
print('R2:', round(rf_pipeline.score(X_test, y_test), 4))
print('Adjusted R2:', round(rf_pipeline_adjusted_r2, 4))
print("Cross Validated R2: ", round(cv_rf_pipeline.mean(), 4))
看起來(lái)使用RFE的隨機(jī)森林模型更好!
正則化線性模型
1. 正則化
正則化是一種用于減少模型過(guò)擬合的技術(shù)袋哼。當(dāng)模型過(guò)擬合時(shí)冀墨,它在訓(xùn)練數(shù)據(jù)上表現(xiàn)得很好,但在新數(shù)據(jù)上的表現(xiàn)卻很差先嬉。正則化通過(guò)在損失函數(shù)中添加一個(gè)正則項(xiàng)來(lái)懲罰模型的復(fù)雜度轧苫,從而減少過(guò)擬合的風(fēng)險(xiǎn)。
常見(jiàn)的正則化方法有L1正則化和L2正則化疫蔓。L1正則化通過(guò)在損失函數(shù)中添加模型參數(shù)的絕對(duì)值之和來(lái)懲罰模型的復(fù)雜度含懊。L2正則化則通過(guò)在損失函數(shù)中添加模型參數(shù)的平方和來(lái)懲罰模型的復(fù)雜度。這兩種方法都可以有效地減少模型的復(fù)雜度衅胀,從而降低過(guò)擬合的風(fēng)險(xiǎn)岔乔。
在實(shí)際應(yīng)用中,我們可以通過(guò)調(diào)整正則化參數(shù)來(lái)控制正則化的強(qiáng)度滚躯。較大的正則化參數(shù)會(huì)導(dǎo)致模型更加簡(jiǎn)單雏门,但可能會(huì)增加欠擬合的風(fēng)險(xiǎn)。較小的正則化參數(shù)則會(huì)使模型更加復(fù)雜掸掏,但可能會(huì)增加過(guò)擬合的風(fēng)險(xiǎn)茁影。因此,選擇合適的正則化參數(shù)非常重要丧凤。
正則化是機(jī)器學(xué)習(xí)中常用的技術(shù)之一募闲,它可以幫助我們構(gòu)建更加穩(wěn)健和泛化能力強(qiáng)的模型。在實(shí)際應(yīng)用中愿待,我們經(jīng)常需要使用正則化來(lái)提高模型的性能和魯棒性浩螺。
模型訓(xùn)練中的兩個(gè)主要問(wèn)題
在訓(xùn)練模型時(shí),可能會(huì)遇到兩個(gè)主要問(wèn)題:過(guò)擬合和欠擬合仍侥。
- 過(guò)擬合:當(dāng)模型在訓(xùn)練集上表現(xiàn)良好要出,但在測(cè)試數(shù)據(jù)上表現(xiàn)不佳時(shí)。
- 欠擬合:當(dāng)模型在訓(xùn)練集和測(cè)試集上都表現(xiàn)不佳時(shí)农渊。
特別是在訓(xùn)練集和測(cè)試集性能之間存在較大差異時(shí)患蹂,會(huì)實(shí)施正則化以避免數(shù)據(jù)過(guò)擬合。通過(guò)正則化砸紊,訓(xùn)練中使用的特征數(shù)量保持不變传于,但是方程1.1中的系數(shù)(w)的大小會(huì)減小。
2. 嶺回歸
嶺回歸是線性回歸的擴(kuò)展批糟,它在訓(xùn)練期間向損失函數(shù)添加正則化L2懲罰。當(dāng)存在多個(gè)高度相關(guān)的變量時(shí)看铆,可以使用嶺回歸徽鼎。它通過(guò)對(duì)變量的系數(shù)進(jìn)行懲罰來(lái)防止過(guò)擬合。嶺回歸通過(guò)向誤差函數(shù)添加懲罰項(xiàng)來(lái)縮小系數(shù)的大小,從而減少過(guò)擬合否淤。
嶺回歸的優(yōu)點(diǎn):
- 比最小二乘/線性回歸更具有抗共線性的魯棒性悄但;
- 比線性回歸對(duì)異常值不那么敏感(但仍然敏感);
- 不需要數(shù)據(jù)完全歸一化石抡;
- 即使變量的數(shù)量大于觀測(cè)值的數(shù)量檐嚣,也可以應(yīng)用。
嶺回歸的缺點(diǎn):
- 可能需要更多的數(shù)據(jù)才能獲得準(zhǔn)確的結(jié)果啰扛;
- 可能需要更多的計(jì)算資源嚎京;
- 結(jié)果可能難以解釋鞍帝,因?yàn)閹X項(xiàng)或L2范數(shù)修改了系數(shù)煞茫;
- 如果數(shù)據(jù)包含異常值帕涌,則對(duì)異常值敏感续徽,可能產(chǎn)生不穩(wěn)定的結(jié)果。
# 提取特征和目標(biāo)變量
X = scaled_boston.iloc[:, :-1].values # 提取所有行的除最后一列外的所有列作為特征
y = scaled_boston.iloc[:, -1].values # 提取所有行的最后一列作為目標(biāo)變量
# 將數(shù)據(jù)集X和標(biāo)簽y按照30%的比例分割成訓(xùn)練集和測(cè)試集
# random_state = 42表示隨機(jī)種子為42钦扭,保證每次運(yùn)行程序分割的數(shù)據(jù)集一致
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42)
# 導(dǎo)入Ridge模型類
from sklearn.linear_model import Ridge
# 創(chuàng)建并訓(xùn)練模型
ridge_reg = Ridge(alpha=1, solver="cholesky") # 創(chuàng)建一個(gè)Ridge回歸模型纫版,設(shè)置alpha為1捎琐,使用cholesky求解器
ridge_reg.fit(X_train, y_train) # 使用訓(xùn)練數(shù)據(jù)X_train和對(duì)應(yīng)的目標(biāo)值y_train來(lái)訓(xùn)練模型
# 模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
y_pred = ridge_reg.predict(X_test) # 使用訓(xùn)練好的模型對(duì)測(cè)試數(shù)據(jù)X_test進(jìn)行預(yù)測(cè)瑞凑,得到預(yù)測(cè)結(jié)果y_pred
# 預(yù)測(cè)交叉驗(yàn)證分?jǐn)?shù)
cv_ridge = cross_val_score(estimator=ridge_reg, X=X_train, y=y_train, cv=10)
# 計(jì)算調(diào)整后的R平方
r2 = ridge_reg.score(X_test, y_test)
# 觀測(cè)值的數(shù)量是沿著軸0的形狀
n = X_test.shape[0]
# 特征的數(shù)量(預(yù)測(cè)變量籽御,p)是沿著軸1的形狀
p = X_test.shape[1]
# 調(diào)整后的R平方公式
ridge_adjusted_r2 = 1 - (1 - r2) * (n - 1) / (n - p - 1)
ridge_RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))
ridge_R2 = ridge_reg.score(X_test, y_test)
ridgeCV_R2 = cv_ridge.mean()
print('RMSE:', round(np.sqrt(metrics.mean_squared_error(y_test, y_pred)), 4))
print('R2:', round(ridge_reg.score(X_test, y_test), 4))
print('Adjusted R2:', round(ridge_adjusted_r2, 4))
print("Cross Validated R2: ", round(cv_ridge.mean(), 4))
# 設(shè)置圖形的大小
plt.figure(figsize=(10, 5))
# 繪制回歸圖
sns.regplot(x=y_test, y=y_pred)
# 設(shè)置圖形的標(biāo)題和字體大小
plt.title('Ridge Regression model', fontsize=20)
Text(0.5, 1.0, 'Ridge Regression model')
3. Lasso回歸
Lasso回歸是一種常見(jiàn)的正則化線性回歸方法技掏,其中包含L1懲罰項(xiàng)哑梳。Lasso是Least Absolute Shrinkage and Selection Operator的縮寫鸠真。這種方法的效果是縮小那些對(duì)預(yù)測(cè)任務(wù)沒(méi)有太大貢獻(xiàn)的輸入變量的系數(shù)吠卷。
L1懲罰最小化了所有系數(shù)的大小祭隔,并允許任何系數(shù)變?yōu)榱慵部剩瑥亩行У貙⑤斎胩卣鲝哪P椭幸瞥?/p>
LASSO不是一種回歸類型,而是一種可以應(yīng)用于許多回歸類型的模型構(gòu)建和變量選擇方法丈牢,包括普通最小二乘法己沛、邏輯回歸等等申尼。
LASSO的優(yōu)點(diǎn):
- 自動(dòng)特征選擇
- 減少過(guò)擬合
幸運(yùn)的是师幕,由于LASSO內(nèi)置的變量選擇功能霹粥,它可以處理一些多重共線性問(wèn)題后控,而不會(huì)損失可解釋性浩淘。然而张抄,如果共線性過(guò)高署惯,LASSO的變量選擇性能將開(kāi)始下降极谊。在這種情況下怀酷,Ridge回歸更適合嗜闻。
LASSO的缺點(diǎn):
- LASSO模型產(chǎn)生的系數(shù)是有偏的琉雳。添加到模型中的L1懲罰人為地將系數(shù)縮小到接近零翠肘,或者在某些情況下束倍,完全變?yōu)榱恪_@意味著LASSO模型的系數(shù)并不代表特征與結(jié)果之間真實(shí)關(guān)系的大小甥桂,而是其縮小版本黄选。
- 難以估計(jì)標(biāo)準(zhǔn)誤差办陷。由于LASSO模型中的系數(shù)估計(jì)是有偏的,很難對(duì)它們進(jìn)行準(zhǔn)確的標(biāo)準(zhǔn)誤差估計(jì)殃恒。這使得難以對(duì)它們進(jìn)行統(tǒng)計(jì)檢驗(yàn)和建立置信區(qū)間等操作离唐。
- 在相關(guān)特征方面存在困難亥鬓。通常情況下嵌戈,一個(gè)特征會(huì)被相對(duì)任意地選擇熟呛,而與該特征高度相關(guān)的所有其他特征將被有效地從模型中刪除庵朝。這可能導(dǎo)致錯(cuò)誤地得出只有被選擇保留在模型中的特征是重要的結(jié)論九府,而實(shí)際上其他一些特征可能同樣重要甚至更重要侄旬。
- 估計(jì)不穩(wěn)定儡羔。LASSO模型產(chǎn)生的估計(jì)值被認(rèn)為相對(duì)不穩(wěn)定汰蜘,這意味著當(dāng)在稍微不同的數(shù)據(jù)集上進(jìn)行訓(xùn)練時(shí)鉴扫,它們可能會(huì)發(fā)生很大變化坪创。
- 引入超參數(shù)莱预。
# 導(dǎo)入Lasso模型類
from sklearn.linear_model import Lasso
# 創(chuàng)建并訓(xùn)練模型
lasso_reg = Lasso(alpha=0.2) # 創(chuàng)建一個(gè)Lasso回歸模型對(duì)象依沮,設(shè)置alpha參數(shù)為0.2
lasso_reg.fit(X_train, y_train) # 使用訓(xùn)練數(shù)據(jù)X_train和y_train來(lái)訓(xùn)練模型
# 模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
y_pred = lasso_reg.predict(X_test) # 使用訓(xùn)練好的模型對(duì)測(cè)試數(shù)據(jù)X_test進(jìn)行預(yù)測(cè)宋渔,得到預(yù)測(cè)結(jié)果y_pred
# 預(yù)測(cè)交叉驗(yàn)證分?jǐn)?shù)
cv_lasso = cross_val_score(estimator=lasso_reg, X=X_train, y=y_train, cv=10)
# 計(jì)算調(diào)整后的R平方
r2 = lasso_reg.score(X_test, y_test)
# 觀測(cè)值的數(shù)量是沿著軸0的形狀
n = X_test.shape[0]
# 特征的數(shù)量(預(yù)測(cè)變量皇拣,p)是沿著軸1的形狀
p = X_test.shape[1]
# 調(diào)整后的R平方公式
lasso_adjusted_r2 = 1 - (1 - r2) * (n - 1) / (n - p - 1)
lasso_RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))
lasso_R2 = lasso_reg.score(X_test, y_test)
lassoCV_R2 = cv_lasso.mean()
print('RMSE:', round(np.sqrt(metrics.mean_squared_error(y_test, y_pred)), 4))
print('R2:', round(lasso_reg.score(X_test, y_test), 4))
print('Adjusted R2:', round(lasso_adjusted_r2, 4))
print("Cross Validated R2:", round(cv_lasso.mean(), 4))
# 設(shè)置圖形的大小
plt.figure(figsize=(10, 5))
# 繪制回歸圖
sns.regplot(x=y_test, y=y_pred)
# 設(shè)置圖形的標(biāo)題和字體大小
plt.title('Lasso回歸模型', fontsize=20)
Text(0.5, 1.0, 'Lasso Regression model')
4. 貝葉斯嶺回歸
貝葉斯回歸是一種定義和估計(jì)統(tǒng)計(jì)模型的方法氧急。它可以與任何回歸技術(shù)一起使用毒姨,如線性回歸手素、套索回歸等。貝葉斯回歸通過(guò)使用概率分布而不是點(diǎn)估計(jì)來(lái)制定線性回歸疹瘦,從而允許自然機(jī)制來(lái)處理數(shù)據(jù)不足或分布不良的數(shù)據(jù)言沐。輸出或響應(yīng)變量’y’被假設(shè)為來(lái)自概率分布而不是估計(jì)為單個(gè)值险胰。
當(dāng)數(shù)據(jù)集中數(shù)據(jù)不足或數(shù)據(jù)分布不良時(shí)起便,貝葉斯回歸非常有用榆综。
貝葉斯回歸的優(yōu)點(diǎn):
- 當(dāng)數(shù)據(jù)集的大小較小時(shí)非常有效鼻疮。
- 適用于基于在線學(xué)習(xí)的場(chǎng)景(實(shí)時(shí)接收數(shù)據(jù)),與基于批處理學(xué)習(xí)相比挪哄,在開(kāi)始訓(xùn)練模型之前中燥,我們手頭上有整個(gè)數(shù)據(jù)集疗涉。這是因?yàn)樨惾~斯回歸不需要存儲(chǔ)數(shù)據(jù)咱扣。
- 貝葉斯嘗試和測(cè)試的方法在數(shù)學(xué)上非常穩(wěn)健闹伪。
貝葉斯回歸的缺點(diǎn):
- 模型的推斷可能耗時(shí)杀怠。
- 如果數(shù)據(jù)集中有大量可用的數(shù)據(jù)赔退,貝葉斯方法不值得硕旗,常規(guī)的頻率主義方法能更高效地完成任務(wù)漆枚。
# 導(dǎo)入BayesianRidge模型類
from sklearn.linear_model import BayesianRidge
# 創(chuàng)建并訓(xùn)練模型
BayesianRidge_reg = BayesianRidge()
BayesianRidge_reg.fit(X_train, y_train)
# 模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
y_pred = BayesianRidge_reg.predict(X_test)
# 預(yù)測(cè)交叉驗(yàn)證分?jǐn)?shù)
cv_BayesianRidge = cross_val_score(estimator=BayesianRidge_reg, X=X_train, y=y_train, cv=10)
# 計(jì)算調(diào)整后的R平方
r2 = BayesianRidge_reg.score(X_test, y_test)
# 觀測(cè)值的數(shù)量是沿著軸0的形狀
n = X_test.shape[0]
# 特征的數(shù)量(預(yù)測(cè)器,p)是沿著軸1的形狀
p = X_test.shape[1]
# 調(diào)整后的R平方公式
BayesianRidge_adjusted_r2 = 1 - (1 - r2) * (n - 1) / (n - p - 1)
BayesianRidge_RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))
BayesianRidge_R2 = BayesianRidge_reg.score(X_test, y_test)
BayesianRidgeCV_R2 = cv_BayesianRidge.mean()
print('RMSE:', round(np.sqrt(metrics.mean_squared_error(y_test, y_pred)), 6))
print('R2:', round(BayesianRidge_reg.score(X_test, y_test), 6))
print('Adjusted R2:', round(BayesianRidge_adjusted_r2, 6))
print("Cross Validated R2:", round(cv_BayesianRidge.mean(), 6))
# 導(dǎo)入必要的庫(kù)
import matplotlib.pyplot as plt
import seaborn as sns
# 設(shè)置圖形大小
plt.figure(figsize=(10, 5))
# 繪制回歸圖
sns.regplot(x=y_test, y=y_pred)
# 設(shè)置圖形標(biāo)題和字體大小
plt.title('Bayesian Ridge Regression model', fontsize=20)
Text(0.5, 1.0, 'Bayesian Ridge Regression model')
模型評(píng)估
1. 創(chuàng)建新的數(shù)據(jù)框架
# 定義一個(gè)列表models碘橘,其中包含了多個(gè)元組,每個(gè)元組代表一個(gè)模型的名稱和相關(guān)指標(biāo)
models = [('線性回歸', lm_RMSE, lm_R2, lm_adjusted_r2, lmCV_R2),
('隨機(jī)森林回歸', rf_RMSE, rf_R2, rf_adjusted_r2, rfCV_R2),
('線性回歸(VIF)', lm2_RMSE, lm2_R2, lm2_adjusted_r2, lm2CV_R2),
('隨機(jī)森林回歸(VIF)', rf2_RMSE, rf2_R2, rf2_adjusted_r2, rf2CV_R2),
('隨機(jī)森林回歸(RFE)', rf_pipeline_RMSE, rf_pipeline_R2, rf_pipeline_adjusted_r2, rf_pipelineCV_R2),
('嶺回歸', lasso_RMSE, lasso_R2, lasso_adjusted_r2, lassoCV_R2),
('Lasso回歸', ridge_RMSE, ridge_R2, ridge_adjusted_r2, ridgeCV_R2),
('貝葉斯嶺回歸', BayesianRidge_RMSE, BayesianRidge_R2, BayesianRidge_adjusted_r2, BayesianRidgeCV_R2),
]
# 創(chuàng)建一個(gè)名為predictions的數(shù)據(jù)框纺蛆,用于存儲(chǔ)模型的預(yù)測(cè)結(jié)果
# 數(shù)據(jù)框包含以下列:Model(模型名稱)桥氏、RMSE(均方根誤差)字支、R2 Score(R2得分)堕伪、Adjusted R2 Score(調(diào)整后的R2得分)欠雌、Cross Validated R2 Score(交叉驗(yàn)證的R2得分)
predictions = pd.DataFrame(data = models, columns=['Model', 'RMSE', 'R2 Score', 'Adjusted R2 Score', 'Cross Validated R2 Score'])
predictions
結(jié)果可能會(huì)有些令人驚訝富俄。
- 看起來(lái)使用VIF方法進(jìn)行簡(jiǎn)單特征刪除導(dǎo)致了更糟糕的結(jié)果霍比!
- 即使一些更健壯的模型也沒(méi)有比最簡(jiǎn)單的線性回歸表現(xiàn)更好们豌。
結(jié)論是什么?
- VIF并不像我們預(yù)期的那樣簡(jiǎn)單狂打。
- “更好”的模型并不總是更好趴乡。
- 可能我們應(yīng)該更加努力以獲得更好的結(jié)果(例如通過(guò)參數(shù)調(diào)整)。
2. 可視化模型性能
# 導(dǎo)入必要的庫(kù)已經(jīng)完成惦辛,不需要再添加import語(yǔ)句
# 創(chuàng)建一個(gè)畫布和一個(gè)子圖
f, axe = plt.subplots(1,1, figsize=(18,6))
# 按照交叉驗(yàn)證R2得分進(jìn)行排序
predictions.sort_values(by=['Cross Validated R2 Score'], ascending=False, inplace=True)
# 使用sns庫(kù)中的barplot函數(shù)繪制條形圖胖齐,x軸為交叉驗(yàn)證R2得分呀伙,y軸為模型名稱,數(shù)據(jù)來(lái)源為predictions雨女,子圖為axe
sns.barplot(x='Cross Validated R2 Score', y='Model', data = predictions, ax = axe)
# 設(shè)置x軸標(biāo)簽為"Cross Validated R2 Score"泪蔫,字體大小為16
axe.set_xlabel('Cross Validated R2 Score', size=16)
# 設(shè)置y軸標(biāo)簽為"Model"
axe.set_ylabel('Model')
# 設(shè)置x軸范圍為0到1.0
axe.set_xlim(0,1.0)
# 顯示圖形
plt.show()
使用GridSearchCV進(jìn)行超參數(shù)調(diào)優(yōu)
超參數(shù)調(diào)整是在構(gòu)建機(jī)器學(xué)習(xí)模型時(shí)調(diào)整參數(shù)元組的過(guò)程疗垛。這些參數(shù)是由我們定義的塑崖。機(jī)器學(xué)習(xí)算法不會(huì)學(xué)習(xí)這些參數(shù)规婆。這些參數(shù)可以在不同的步驟中進(jìn)行調(diào)整。
GridSearchCV是一種從給定的參數(shù)網(wǎng)格中找到最佳超參數(shù)值的技術(shù)嗡髓。它本質(zhì)上是一種交叉驗(yàn)證技術(shù)饿这。必須輸入模型以及參數(shù)长捧。在提取最佳參數(shù)值后,進(jìn)行預(yù)測(cè)奉芦。
GridSearchCV識(shí)別的“最佳”參數(shù)實(shí)際上是在您的參數(shù)網(wǎng)格中包含的參數(shù)的最佳值声功。
1. 調(diào)整后的嶺回歸
# 導(dǎo)入PolynomialFeatures類
from sklearn.preprocessing import PolynomialFeatures
# PolynomialFeatures是通過(guò)將現(xiàn)有特征提升到指數(shù)來(lái)創(chuàng)建的特征其爵。
# 例如摩渺,如果一個(gè)數(shù)據(jù)集有一個(gè)輸入特征X,
# 那么多項(xiàng)式特征將是添加一個(gè)新的特征(列)绰姻,其中的值是通過(guò)對(duì)X的值進(jìn)行平方計(jì)算得到的狂芋,例如X^2。
# 定義步驟列表屡萤,其中包含兩個(gè)步驟:'poly'和'model'
steps = [
('poly', PolynomialFeatures(degree=2)), # 使用degree=2創(chuàng)建二次多項(xiàng)式特征
('model', Ridge(alpha=3.8, fit_intercept=True)) # 使用Ridge回歸模型死陆,設(shè)置alpha=3.8和fit_intercept=True
]
# 創(chuàng)建Pipeline對(duì)象迫像,將步驟列表作為參數(shù)傳遞給Pipeline構(gòu)造函數(shù)
ridge_pipe = Pipeline(steps)
# 使用訓(xùn)練數(shù)據(jù)X_train和y_train來(lái)訓(xùn)練Pipeline對(duì)象
ridge_pipe.fit(X_train, y_train)
# 使用訓(xùn)練好的模型對(duì)測(cè)試數(shù)據(jù)X_test進(jìn)行預(yù)測(cè)
y_pred = ridge_pipe.predict(X_test)
# 導(dǎo)入GridSearchCV類
from sklearn.model_selection import GridSearchCV
# 定義alpha參數(shù)的取值范圍
alpha_params = [{'model__alpha': list(range(1, 15))}]
# 創(chuàng)建GridSearchCV對(duì)象菌羽,使用ridge_pipe作為模型注祖,alpha_params作為參數(shù)范圍是晨,cv=10表示使用10折交叉驗(yàn)證
clf = GridSearchCV(ridge_pipe, alpha_params, cv=10)
# 使用訓(xùn)練數(shù)據(jù)擬合和調(diào)優(yōu)模型
clf.fit(X_train, y_train)
# 模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
y_pred = BayesianRidge_reg.predict(X_test)
# 輸出最佳參數(shù)組合及其對(duì)應(yīng)的性能表現(xiàn)
print(clf.best_params_)
{'model__alpha': 12}
# 預(yù)測(cè)交叉驗(yàn)證分?jǐn)?shù)
cv_Ridge3 = cross_val_score(estimator=clf, X=X_train, y=y_train, cv=10)
# 計(jì)算調(diào)整后的R平方
r2 = clf.score(X_test, y_test)
# 觀測(cè)值的數(shù)量是沿著軸0的形狀
n = X_test.shape[0]
# 特征的數(shù)量(預(yù)測(cè)器,p)是沿著軸1的形狀
p = X_test.shape[1]
# 調(diào)整后的R平方公式
Ridge3_adjusted_r2 = 1 - (1 - r2) * (n - 1) / (n - p - 1)
Ridge3_RMSE = np.sqrt(metrics.mean_squared_error(y_test, y_pred))
Ridge3_R2 = clf.score(X_test, y_test)
Ridge3CV_R2 = cv_Ridge3.mean()
print('RMSE:', round(np.sqrt(metrics.mean_squared_error(y_test, y_pred)), 6))
print('R2:', round(clf.score(X_test, y_test), 6))
print('Adjusted R2:', round(Ridge3_adjusted_r2, 6))
print("Cross Validated R2:", round(cv_Ridge3.mean(), 6))
2. 可視化模型性能
# 定義了一個(gè)列表models2烙荷,其中包含了多個(gè)元組
# 每個(gè)元組包含了一個(gè)模型的名稱和相關(guān)的評(píng)估指標(biāo)
# 評(píng)估指標(biāo)包括 Ridge3_RMSE(均方根誤差)终抽、Ridge3_R2(R平方值)、Ridge3_adjusted_r2(調(diào)整后的R平方值)和Ridge3CV_R2(交叉驗(yàn)證的R平方值)
models2 = [('Tuned Ridge Regression', Ridge3_RMSE, Ridge3_R2, Ridge3_adjusted_r2, Ridge3CV_R2)]
# 創(chuàng)建一個(gè)DataFrame對(duì)象predictions2亩码,包含多個(gè)列
# 列名分別為'Model', 'RMSE', 'R2 Score', 'Adjusted R2 Score', 'Cross Validated R2 Score'
# data參數(shù)為models2,即數(shù)據(jù)來(lái)源為models2
predictions2 = pd.DataFrame(data = models2, columns=['Model', 'RMSE', 'R2 Score', 'Adjusted R2 Score', 'Cross Validated R2 Score'])
predictions2
# 使用pd.concat()函數(shù)將predictions和predictions2兩個(gè)數(shù)據(jù)合并為一個(gè)數(shù)據(jù)
# 參數(shù)ignore_index=True表示忽略原始數(shù)據(jù)的索引吏廉,重新生成新的索引
# 參數(shù)sort=False表示不對(duì)合并后的數(shù)據(jù)進(jìn)行排序
result = pd.concat([predictions, predictions2], ignore_index=True, sort=False)
result.head()
# 創(chuàng)建一個(gè)圖形對(duì)象和一個(gè)坐標(biāo)軸對(duì)象
f, axe = plt.subplots(1,1, figsize=(18,6))
# 按照'Cross Validated R2 Score'列的值進(jìn)行降序排序
result.sort_values(by=['Cross Validated R2 Score'], ascending=False, inplace=True)
# 使用條形圖顯示數(shù)據(jù),x軸為'Cross Validated R2 Score'汹买,y軸為'Model'
sns.barplot(x='Cross Validated R2 Score', y='Model', data = result, ax = axe)
# 設(shè)置x軸標(biāo)簽為'Cross Validated R2 Score'佩伤,字體大小為16
axe.set_xlabel('Cross Validated R2 Score', size=16)
# 設(shè)置y軸標(biāo)簽為'Model'
axe.set_ylabel('Model')
# 設(shè)置x軸的范圍為0到1.0
axe.set_xlim(0,1.0)
# 顯示圖形
plt.show()
我們可以看到,調(diào)整后的嶺回歸甚至在考慮交叉驗(yàn)證的R2得分時(shí)也優(yōu)于隨機(jī)森林回歸器RFE晦毙!
但是 - 這顯然不是結(jié)束生巡。我們可以調(diào)整其他模型 ?? 這是機(jī)器學(xué)習(xí)中永無(wú)止境的故事,這顯然是令人興奮的部分 ??