www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > AI科技大本營(yíng)
[導(dǎo)讀]作者|俊欣來(lái)源|關(guān)于數(shù)據(jù)分析與可視化今天小編來(lái)說(shuō)說(shuō)如何通過(guò)pandas以及sklearn這兩個(gè)模塊來(lái)對(duì)數(shù)據(jù)集進(jìn)行特征篩選,畢竟有時(shí)候我們拿到手的數(shù)據(jù)集是非常龐大的,有著非常多的特征,減少這些特征的數(shù)量會(huì)帶來(lái)許多的好處,例如提高預(yù)測(cè)的精準(zhǔn)度降低過(guò)擬合的風(fēng)險(xiǎn)加快模型的訓(xùn)練速度增加模型...


作者 | 俊欣來(lái)源 | 關(guān)于數(shù)據(jù)分析與可視化今天小編來(lái)說(shuō)說(shuō)如何通過(guò)pandas以及sklearn這兩個(gè)模塊來(lái)對(duì)數(shù)據(jù)集進(jìn)行特征篩選,畢竟有時(shí)候我們拿到手的數(shù)據(jù)集是非常龐大的,有著非常多的特征,減少這些特征的數(shù)量會(huì)帶來(lái)許多的好處,例如


  • 提高預(yù)測(cè)的精準(zhǔn)度
  • 降低過(guò)擬合的風(fēng)險(xiǎn)
  • 加快模型的訓(xùn)練速度
  • 增加模型的可解釋性
事實(shí)上,很多時(shí)候也并非是特征數(shù)量越多訓(xùn)練出來(lái)的模型越好,當(dāng)添加的特征多到一定程度的時(shí)候,模型的性能就會(huì)下降,從下圖中我們可以看出,


因此我們需要找到哪些特征是最佳的使用特征,當(dāng)然我們這里分連續(xù)型的變量以及離散型的變量來(lái)討論,畢竟不同數(shù)據(jù)類型的變量處理的方式不同,我們先來(lái)看一下對(duì)于連續(xù)型的變量而言,特征選擇到底是怎么來(lái)進(jìn)行的。



計(jì)算一下各個(gè)變量之間的相關(guān)性

我們先導(dǎo)入所需要用到的模塊以及導(dǎo)入數(shù)據(jù)集,并且用pandas模塊來(lái)讀取from sklearn.datasets import load_boston
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.api as sm
%matplotlib inline
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.feature_selection import RFE
from sklearn.linear_model import RidgeCV, LassoCV, Ridge, Lasso
這次用到的數(shù)據(jù)集是機(jī)器學(xué)習(xí)中尤其是初學(xué)者經(jīng)常碰到的,波士頓房?jī)r(jià)的數(shù)據(jù)集,其中我們要預(yù)測(cè)的這個(gè)對(duì)象是MEDV這一列x = load_boston()
df = pd.DataFrame(x.data, columns = x.feature_names)
df["MEDV"] = x.target
X = df.drop("MEDV",1) #將模型當(dāng)中要用到的特征變量保留下來(lái)
y = df["MEDV"] #最后要預(yù)測(cè)的對(duì)象
df.head()
output CRIM    ZN  INDUS  CHAS    NOX  ...    TAX  PTRATIO       B  LSTAT  MEDV
0  0.00632  18.0   2.31   0.0  0.538  ...  296.0     15.3  396.90   4.98  24.0
1  0.02731   0.0   7.07   0.0  0.469  ...  242.0     17.8  396.90   9.14  21.6
2  0.02729   0.0   7.07   0.0  0.469  ...  242.0     17.8  392.83   4.03  34.7
3  0.03237   0.0   2.18   0.0  0.458  ...  222.0     18.7  394.63   2.94  33.4
4  0.06905   0.0   2.18   0.0  0.458  ...  222.0     18.7  396.90   5.33  36.2
我們可以來(lái)看一下特征變量的數(shù)據(jù)類型df.dtypes
outputCRIM       float64
ZN         float64
INDUS      float64
CHAS       float64
NOX        float64
RM         float64
AGE        float64
DIS        float64
RAD        float64
TAX        float64
PTRATIO    float64
B          float64
LSTAT      float64
MEDV       float64
dtype: object
我們看到都是清一色的連續(xù)型的變量,我們來(lái)計(jì)算一下自變量和因變量之間的相關(guān)性,通過(guò)seaborn模塊當(dāng)中的熱力圖來(lái)展示,代碼如下plt.figure(figsize=(10,8))
cor = df.corr()
sns.heatmap(cor, annot=True, cmap=plt.cm.Reds)
plt.show()

相關(guān)系數(shù)的值一般是在-1到1這個(gè)區(qū)間內(nèi)波動(dòng)的
  • 相關(guān)系數(shù)要是接近于0意味著變量之間的相關(guān)性并不強(qiáng)
  • 接近于-1意味著變量之間呈負(fù)相關(guān)的關(guān)系
  • 接近于1意味著變量之間呈正相關(guān)的關(guān)系
我們來(lái)看一下對(duì)于因變量而言,相關(guān)性比較高的自變量有哪些# 篩選出于因變量之間的相關(guān)性
cor_target = abs(cor["MEDV"])
# 挑選于大于0.5的相關(guān)性系數(shù)
relevant_features = cor_target[cor_target>0.5]
relevant_features
outputRM         0.695360
PTRATIO    0.507787
LSTAT      0.737663
MEDV       1.000000
Name: MEDV, dtype: float64
篩選出3個(gè)相關(guān)性比較大的自變量來(lái),然后我們來(lái)看一下自變量之間的相關(guān)性如何,要是自變量之間的相關(guān)性非常強(qiáng)的話,我們也只需要保留其中的一個(gè)就行,print(df[["LSTAT","PTRATIO"]].corr())
print("=" * 50)
print(df[["RM","LSTAT"]].corr())
print("=" * 50)
print(df[["PTRATIO","RM"]].corr())
output LSTAT   PTRATIO
LSTAT    1.000000  0.374044
PTRATIO  0.374044  1.000000
==================================================
RM     LSTAT
RM     1.000000 -0.613808
LSTAT -0.613808  1.000000
==================================================
PTRATIO        RM
PTRATIO  1.000000 -0.355501
RM      -0.355501  1.000000
從上面的結(jié)果中我們可以看到,RM變量和LSTAT這個(gè)變量是相關(guān)性是比較高的,我們只需要保留其中一個(gè)就可以了,我們選擇保留LSTAT這個(gè)變量,因?yàn)樗c因變量之間的相關(guān)性更加高一些

遞歸消除法

我們可以嘗試這么一種策略,我們選擇一個(gè)基準(zhǔn)模型,起初將所有的特征變量傳進(jìn)去,我們?cè)俅_認(rèn)模型性能的同時(shí)通過(guò)對(duì)特征變量的重要性進(jìn)行排序,去掉不重要的特征變量,然后不斷地重復(fù)上面的過(guò)程直到達(dá)到所需數(shù)量的要選擇的特征變量。LR= LinearRegression()
# 挑選出7個(gè)相關(guān)的變量
rfe_model = RFE(model, 7)
# 交給模型去進(jìn)行擬合
X_rfe = rfe_model.fit_transform(X,y)
LR.fit(X_rfe,y)
# 輸出各個(gè)變量是否是相關(guān)的,并且對(duì)其進(jìn)行排序
print(rfe_model.support_)
print(rfe_model.ranking_)
output[False False False  True  True  True False  True  True False  True False
True]
[2 4 3 1 1 1 7 1 1 5 1 6 1]
第一行的輸出包含True和False,其中True代表的是相關(guān)的變量對(duì)應(yīng)下一行的輸出中的1,而False包含的是不相關(guān)的變量,然后我們需要所需要多少個(gè)特征變量,才能夠使得模型的性能達(dá)到最優(yōu)#將13個(gè)特征變量都依次遍歷一遍
feature_num_list=np.arange(1,13)
# 定義一個(gè)準(zhǔn)確率
high_score=0
# 最優(yōu)需要多少個(gè)特征變量
num_of_features=0
score_list =[]
for n in range(len(feature_num_list)):
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.3, random_state = 0)
model = LinearRegression()
rfe_model = RFE(model,feature_num_list[n])
X_train_rfe_model = rfe_model.fit_transform(X_train,y_train)
X_test_rfe_model = rfe_model.transform(X_test)
model.fit(X_train_rfe_model,y_train)
score = model.score(X_test_rfe_model,y_test)
score_list.append(score)
if(score>high_score):
high_score = score
num_of_features = feature_num_list[n]
print("最優(yōu)的變量是: %d個(gè)" %num_of_features)
print("%d個(gè)變量的準(zhǔn)確率為: %f" % (num_of_features, high_score))
output最優(yōu)的變量是: 10個(gè)
10個(gè)變量的準(zhǔn)確率為: 0.663581
從上面的結(jié)果可以看出10個(gè)變量對(duì)于整個(gè)模型來(lái)說(shuō)是最優(yōu)的,然后我們來(lái)看一下到底是哪10個(gè)特征變量cols = list(X.columns)
model = LinearRegression()
# 初始化RFE模型,篩選出10個(gè)變量
rfe_model = RFE(model, 10)
X_rfe = rfe.fit_transform(X,y)
# 擬合訓(xùn)練模型
model.fit(X_rfe,y)
df = pd.Series(rfe.support_,index = cols)
selected_features = df[df==True].index
print(selected_features)
outputIndex(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'DIS', 'RAD', 'PTRATIO',
'LSTAT'],
dtype='object')

正則化

例如對(duì)于Lasso的正則化而言,對(duì)于不相關(guān)的特征而言,該算法會(huì)讓其相關(guān)系數(shù)變?yōu)?,因此不相關(guān)的特征變量很快就會(huì)被排除掉了,只剩下相關(guān)的特征變量lasso = LassoCV()
lasso.fit(X, y)
coef = pd.Series(lasso.coef_, index = X.columns)
然后我們看一下哪些變量的相關(guān)系數(shù)是0print("Lasso算法挑選了 " str(sum(coef != 0)) " 個(gè)變量,然后去除掉了" str(sum(coef == 0)) "個(gè)變量")
outputLasso算法挑選了10個(gè)變量,然后去除掉了3個(gè)變量
我們來(lái)對(duì)計(jì)算出來(lái)的相關(guān)性系數(shù)排個(gè)序并且做一個(gè)可視化imp_coef = coef.sort_values()
matplotlib.rcParams['figure.figsize'] = (8, 6)
imp_coef.plot(kind = "barh")
plt.title("Lasso Model Feature Importance")
output可以看到當(dāng)中有3個(gè)特征,‘NOX’、'CHAS'、'INDUS'的相關(guān)性為0

根據(jù)缺失值來(lái)進(jìn)行判斷

下面我們來(lái)看一下如何針對(duì)離散型的特征變量來(lái)做處理,首先我們可以根據(jù)缺失值的比重來(lái)進(jìn)行判斷,要是對(duì)于一個(gè)離散型的特征變量而言,絕大部分的值都是缺失的,那這個(gè)特征變量也就沒(méi)有存在的必要了,我們可以針對(duì)這個(gè)思路在進(jìn)行判斷。首先導(dǎo)入所需要用到的數(shù)據(jù)集train = pd.read_csv("credit_example.csv")
train_labels = train['TARGET']
train = train.drop(columns = ['TARGET'])
我們可以先來(lái)計(jì)算一下數(shù)據(jù)集當(dāng)中每個(gè)特征變量缺失值的比重missing_series = train.isnull().sum() / train.shape[0]
df = pd.DataFrame(missing_series).rename(columns = {'index': '特征變量', 0: '缺失值比重'})
df.sort_values("缺失值比重", ascending = False).head()
output 缺失值比重
COMMONAREA_AVG            0.6953
COMMONAREA_MODE           0.6953
COMMONAREA_MEDI           0.6953
NONLIVINGAPARTMENTS_AVG   0.6945
NONLIVINGAPARTMENTS_MODE  0.6945
我們可以看到缺失值最高的比重將近有70%,我們也可以用可視化的根據(jù)來(lái)繪制一下缺失值比重的分布圖plt.rcParams['font.sans-serif']=['SimHei'] #用來(lái)正常顯示中文標(biāo)簽
plt.figure(figsize = (7, 5))
plt.hist(df['缺失值比重'], bins = np.linspace(0, 1, 11), edgecolor = 'k', color = 'blue', linewidth = 2)
plt.xticks(np.linspace(0, 1, 11));
plt.xlabel('缺失值的比重', size = 14);
plt.ylabel('特征變量的數(shù)量', size = 14);
plt.title("缺失值分布圖", size = 14);
output我們可以看到有一部分特征變量,它們?nèi)笔е档谋戎卦?0%以上,有一些還在60%以上,我們可以去除掉當(dāng)中的部分特征變量

計(jì)算特征的重要性

在基于樹(shù)的眾多模型當(dāng)中,會(huì)去計(jì)算每個(gè)特征變量的重要性,也就是feature_importances_屬性,得出各個(gè)特征變量的重要性程度之后再進(jìn)行特征的篩選from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier()
# 模型擬合數(shù)據(jù)
clf.fit(X,Y)
feat_importances = pd.Series(clf.feature_importances_, index=X.columns)
# 篩選出特征的重要性程度最大的10個(gè)特征
feat_importances.nlargest(10)
我們同時(shí)也可以對(duì)特征的重要性程度進(jìn)行可視化,feat_importances.nlargest(10).plot(kind='barh', figsize = (8, 6))
output除了隨機(jī)森林之外,基于樹(shù)的算法模型還有很多,如LightGBM、XGBoost等等,大家也都可以通過(guò)對(duì)特征重要性的計(jì)算來(lái)進(jìn)行特征的篩選

Select_K_Best算法

Sklearn模塊當(dāng)中還提供了SelectKBest的API,針對(duì)回歸問(wèn)題或者是分類問(wèn)題,我們挑選合適的模型評(píng)估指標(biāo),然后設(shè)定K值也就是既定的特征變量的數(shù)量,進(jìn)行特征的篩選。假定我們要處理的是分類問(wèn)題的特征篩選,我們用到的是iris數(shù)據(jù)集iris_data = load_iris()
x = iris_data.data
y = iris_data.target

print("數(shù)據(jù)集的行與列的數(shù)量: ", x.shape)
output數(shù)據(jù)集的行與列的數(shù)量:  (150, 4)
對(duì)于分類問(wèn)題,我們采用的評(píng)估指標(biāo)是卡方,假設(shè)我們要挑選出3個(gè)對(duì)于模型最佳性能而言的特征變量,因此我們將K設(shè)置成3select = SelectKBest(score_func=chi2, k=3)
# 擬合數(shù)據(jù)
z = select.fit_transform(x,y)
filter_1 = select.get_support()
features = array(iris.feature_names)
print("所有的特征: ", features)
print("篩選出來(lái)最優(yōu)的特征是: ", features[filter_1])
output所有的特征:  ['sepal length (cm)' 'sepal width (cm)' 'petal length (cm)'
'petal width (cm)']
篩選出來(lái)最優(yōu)的特征是:  ['sepal length (cm)' 'petal length (cm)' 'petal width (cm)']
那么對(duì)于回歸的問(wèn)題而言,我們可以選擇上面波士頓房?jī)r(jià)的例子,同理我們想要篩選出對(duì)于模型最佳的性能而言的7個(gè)特征變量,同時(shí)對(duì)于回歸問(wèn)題的評(píng)估指標(biāo)用的是f_regressionboston_data = load_boston()
x = boston_data.data
y = boston_data.target
然后我們將擬合數(shù)據(jù),并且進(jìn)行特征變量的篩選select_regression = SelectKBest(score_func=f_regression, k=7)
z = select_regression.fit_transform(x, y)

filter_2 = select_regression.get_support()
features_regression = array(boston_data.feature_names)

print("所有的特征變量有:")
print(features_regression)

print("篩選出來(lái)的7個(gè)特征變量則是:")
print(features_regression[filter_2])
output
所有的特征變量有:['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO' 'B' 'LSTAT']篩選出來(lái)的7個(gè)特征變量則是:['CRIM' 'INDUS' 'NOX' 'RM' 'TAX' 'PTRATIO' 'LSTAT']





本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

“云原生”一詞最初來(lái)自Matt Stine在2013年寫(xiě)的一本書(shū)——《Migrating to Cloud-Native Application Architectures》,書(shū)名中的Cloud-Native即是“云原生...

關(guān)鍵字: 云原生 AWS 云計(jì)算 人工智能 機(jī)器學(xué)習(xí)

(全球TMT2022年10月17日訊)日前,德勤中國(guó)旗下德勤管理咨詢中國(guó)數(shù)據(jù)科學(xué)卓越中心所出品的"機(jī)器學(xué)習(xí)推薦算法"論文被第十三屆IEEE 知識(shí)圖譜國(guó)際會(huì)議(簡(jiǎn)稱"ICKG")收錄。ICKG是知識(shí)圖譜研究領(lǐng)域的國(guó)際權(quán)威...

關(guān)鍵字: 機(jī)器學(xué)習(xí) IC CK MULTI

上海2022年10月17日 /美通社/ -- 日前,德勤中國(guó)迎來(lái)喜訊:旗下德勤管理咨詢中國(guó)數(shù)據(jù)科學(xué)卓越中心所出品的"機(jī)器學(xué)習(xí)推薦算法"論文被第十三屆IEEE 知識(shí)圖譜國(guó)際會(huì)議(以下簡(jiǎn)稱"IC...

關(guān)鍵字: 機(jī)器學(xué)習(xí) IC CK FM

在這篇文章中,小編將對(duì)大數(shù)據(jù)的相關(guān)內(nèi)容和情況加以介紹以幫助大家增進(jìn)對(duì)它的了解程度,和小編一起來(lái)閱讀以下內(nèi)容吧。

關(guān)鍵字: 大數(shù)據(jù) Hadoop 機(jī)器學(xué)習(xí)

濟(jì)南2022年10月14日 /美通社/ -- 近日,浪潮新基建成功通過(guò)CMMI(軟件能力成熟度集成模型)三級(jí)認(rèn)證并正式獲得資質(zhì)證書(shū)。繼2021年組建后,僅一年時(shí)間就斬獲全球軟件領(lǐng)域最權(quán)威的認(rèn)證之一,標(biāo)志著浪潮新基建在技術(shù)...

關(guān)鍵字: 軟件 新基建 智慧城市 模型

北京2022年10月13日 /美通社/ -- 近日,中科寒武紀(jì)科技股份有限公司(以下簡(jiǎn)稱"寒武紀(jì)")的思元370系列智能加速卡與浪潮AIStation智能業(yè)務(wù)生產(chǎn)創(chuàng)新平臺(tái)完成兼容性適配認(rèn)證,...

關(guān)鍵字: STATION 加速卡 AI 模型

蘇州2022年10月13日 /美通社/ -- 北京時(shí)間2022年10月13日,開(kāi)拓藥業(yè)(股票代碼:9939.HK),一家專注于潛在同類首創(chuàng)和同類最佳創(chuàng)新藥物研發(fā)及產(chǎn)業(yè)化的生物制藥公司,宣布其聯(lián)合美國(guó)德克薩斯大學(xué)...

關(guān)鍵字: 模型 LM EMI PD

一直以來(lái),機(jī)器學(xué)習(xí)都是大家的關(guān)注焦點(diǎn)之一。因此針對(duì)大家的興趣點(diǎn)所在,小編將為大家?guī)?lái)機(jī)器學(xué)習(xí)的相關(guān)介紹,詳細(xì)內(nèi)容請(qǐng)看下文。

關(guān)鍵字: 機(jī)器學(xué)習(xí) 深度學(xué)習(xí) 數(shù)據(jù)挖掘

在下述的內(nèi)容中,小編將會(huì)對(duì)機(jī)器學(xué)習(xí)的相關(guān)消息予以報(bào)道,如果機(jī)器學(xué)習(xí)是您想要了解的焦點(diǎn)之一,不妨和小編共同閱讀這篇文章哦。

關(guān)鍵字: 機(jī)器學(xué)習(xí) 監(jiān)督學(xué)習(xí) 特征選擇

以下內(nèi)容中,小編將對(duì)機(jī)器學(xué)習(xí)的相關(guān)內(nèi)容進(jìn)行著重介紹和闡述,希望本文能幫您增進(jìn)對(duì)機(jī)器學(xué)習(xí)的了解,和小編一起來(lái)看看吧。

關(guān)鍵字: 機(jī)器學(xué)習(xí) 特征工程 監(jiān)督學(xué)習(xí)

AI科技大本營(yíng)

111 篇文章

關(guān)注

發(fā)布文章

編輯精選

技術(shù)子站

關(guān)閉