機(jī)器學(xué)習(xí)特征相關(guān)性及多重共線性

一滚秩、相關(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)的特征致盟。
  1. 手動(dòng)方法 - 方差膨脹因子(VIF)
  2. 自動(dòng)方法 - 遞歸特征消除(RFE)
  3. 使用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ù)吼句。

調(diào)整R平方

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的步驟如下:

  1. 選擇一個(gè)機(jī)器學(xué)習(xí)模型作為基礎(chǔ)模型厌小。
  2. 根據(jù)模型的性能選擇最佳或最差的特征。
  3. 將選擇的特征從特征集中移除战秋。
  4. 重復(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ú)止境的故事,這顯然是令人興奮的部分 ??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末见妒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子须揣,更是在濱河造成了極大的恐慌盐股,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耻卡,死亡現(xiàn)場(chǎng)離奇詭異疯汁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)卵酪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門幌蚊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秸谢,“玉大人,你說(shuō)我怎么就攤上這事霹肝」捞悖” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵沫换,是天一觀的道長(zhǎng)臭蚁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)讯赏,這世上最難降的妖魔是什么垮兑? 我笑而不...
    開(kāi)封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮漱挎,結(jié)果婚禮上系枪,老公的妹妹穿的比我還像新娘。我一直安慰自己磕谅,他們只是感情好私爷,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著膊夹,像睡著了一般衬浑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上放刨,一...
    開(kāi)封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天工秩,我揣著相機(jī)與錄音,去河邊找鬼进统。 笑死助币,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的螟碎。 我是一名探鬼主播眉菱,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼抚芦!你這毒婦竟也來(lái)了倍谜?” 一聲冷哼從身側(cè)響起迈螟,我...
    開(kāi)封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叉抡,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后答毫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體褥民,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年洗搂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了消返。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片载弄。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撵颊,靈堂內(nèi)的尸體忽然破棺而出宇攻,到底是詐尸還是另有隱情,我是刑警寧澤倡勇,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布逞刷,位于F島的核電站,受9級(jí)特大地震影響妻熊,放射性物質(zhì)發(fā)生泄漏夸浅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一扔役、第九天 我趴在偏房一處隱蔽的房頂上張望帆喇。 院中可真熱鬧,春花似錦亿胸、人聲如沸坯钦。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)葫笼。三九已至,卻和暖如春拗馒,著一層夾襖步出監(jiān)牢的瞬間路星,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工诱桂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洋丐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓挥等,卻偏偏與公主長(zhǎng)得像友绝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肝劲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1.多重共線性 多重共線性是解釋變量存在線性關(guān)系或者近似的線性關(guān)系辞槐,多重共線性影響的模型一般為底層是線性的模型掷漱,例...
    enhengz閱讀 41,549評(píng)論 0 17
  • 多重共線性產(chǎn)生的背景和原因 在研究實(shí)際問(wèn)題時(shí),考慮的解釋變量往往有很多個(gè),解釋變量之間完全不相關(guān)的情形是非常少見(jiàn)的...
    忠教閱讀 5,516評(píng)論 0 1
  • 多元回歸分析中的共線性問(wèn)題 原創(chuàng) 2015-11-13 ccccfys spss統(tǒng)計(jì)分析 多重共線性:回歸模型中卜范,...
    fun游樂(lè)場(chǎng)閱讀 2,542評(píng)論 0 1
  • 一、多重共線性說(shuō)明 多重共線性一般是指:如果有兩個(gè)或者多個(gè)自變量高度相關(guān)(相關(guān)系數(shù)大于0.8)鹿榜,難以區(qū)分一個(gè)自變量...
    spssau閱讀 785評(píng)論 0 2
  • 回歸分析需要考慮多重共線性問(wèn)題海雪。多重共線性是指自變量之間存在高度相關(guān)性锦爵,導(dǎo)致回歸模型的系數(shù)估計(jì)不穩(wěn)定和假設(shè)檢驗(yàn)不可...
    spssau閱讀 8,021評(píng)論 0 1