python特征递归消除
一、基礎(chǔ)知識(shí)了解
?特征遞歸消除官方給了兩者方法
1.RFE
2.RFECV
一.RFE
官方解釋
鏈接:sklearn.feature_selection.RFE — scikit-learn 1.0.2 documentationhttps://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html?highlight=rfe#sklearn.feature_selection.RFE????????給定一個(gè)為特征分配權(quán)重的外部估計(jì)器(例如,線性模型的系數(shù)),遞歸特征消除(RFE)的目標(biāo)是通過遞歸地考慮越來越小的特征集來選擇特征。首先,估計(jì)器在初始特征集上進(jìn)行訓(xùn)練,每個(gè)特征的重要性通過任何特定屬性或可調(diào)用獲得。然后,從當(dāng)前的特征集中剪除最不重要的特征。該過程在修剪后的集合上遞歸重復(fù),直到最終達(dá)到要選擇的所需特征數(shù)量。
庫
sklearn.feature_selection.RFE
重要參數(shù)
| estimator | 監(jiān)督學(xué)習(xí)估計(jì)有fit提供有關(guān)功能的重要性(如信息的方法coef_,feature_importances_) 只估計(jì)器有具備這兩個(gè)的其中一個(gè)才能進(jìn)行特征遞歸消除 例如:隨機(jī)森林 |
| n_features_to_select | 要選擇的特征數(shù)。如果None,則選擇一半的特征。如果是整數(shù),則參數(shù)是要選擇的特征的絕對(duì)數(shù)量。如果在 0 和 1 之間浮動(dòng),則它是要選擇的特征的一部分。 |
| step | 如果大于或等于 1,則step對(duì)應(yīng)于每次迭代要?jiǎng)h除的(整數(shù))個(gè)特征。如果在 (0.0, 1.0) 范圍內(nèi),則step對(duì)應(yīng)于每次迭代中要?jiǎng)h除的特征的百分比(向下舍入) |
重要屬性
| ranking_ | 特征排名,ranking_[i]?對(duì)應(yīng)于第 i 個(gè)特征的排名位置。選定(即估計(jì)的最佳)特征被分配等級(jí) 1。 |
| support_ | 所選特征的掩碼。 |
二.RFECV
使用交叉驗(yàn)證進(jìn)行遞歸特征消除以選擇特征數(shù)量
鏈接
sklearn.feature_selection.RFECV — scikit-learn 1.0.2 documentationhttps://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFECV.html?highlight=rfe#sklearn.feature_selection.RFECV庫
sklearn.feature_selection.RFECV
重要參數(shù)
| estimator | 和RFE一樣 一種監(jiān)督學(xué)習(xí)估計(jì)器,其fit方法通過coef_?屬性或feature_importances_屬性提供有關(guān)特征重要性的信息。 |
| step | 和RFE一樣 如果大于或等于 1,則step對(duì)應(yīng)于每次迭代要?jiǎng)h除的(整數(shù))個(gè)特征。如果在 (0.0, 1.0) 范圍內(nèi),則step對(duì)應(yīng)于每次迭代中要?jiǎng)h除的特征的百分比(向下舍入)。請(qǐng)注意,最后一次迭代可能會(huì)刪除少于 的step特征以達(dá)到min_features_to_select. |
| cv | 確定交叉驗(yàn)證拆分策略。cv 的可能輸入是:
|
重要屬性
| ranking_ | 特征排名,ranking_[i]?對(duì)應(yīng)于第 i 個(gè)特征的排名位置。選定(即估計(jì)的最佳)特征被分配等級(jí) 1。 |
| support_ | 所選特征的掩碼。 |
利用RFE進(jìn)行
1.利用現(xiàn)有數(shù)據(jù),對(duì)所選估計(jì)器進(jìn)行參數(shù)優(yōu)化
2.查看估計(jì)器的特征重要性
3.根據(jù)重要性,自行確定要選擇的特征數(shù) 或者 利用曲線圖選取最優(yōu)特征數(shù)量(以折線圖為主重要性為輔助參考)
重要性
從下面曲線圖可以看出39因子的時(shí)候分?jǐn)?shù)最高
4.開始進(jìn)行特征消除
代碼如下
import pandas as pd from sklearn.ensemble import RandomForestClassifier as RFC from sklearn.model_selection import cross_val_score import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler from sklearn.feature_selection import RFECV from sklearn.feature_selection import RFE import numpy as np # 1.讀取訓(xùn)練數(shù)據(jù)集 filepath = r"G:\zwh\付老師\河南\1221\2010和2020建模數(shù)據(jù)\4.高砷點(diǎn)與篩選后的低砷點(diǎn)合并2010.xls" #特征因子個(gè)數(shù) feature_number = 45 data = pd.read_excel(filepath) # reading file data = np.array(data) X=data[:,0:feature_number] Y=data[:,-1]# 1.標(biāo)準(zhǔn)化處理 #標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化(standardScale)使得經(jīng)過處理的數(shù)據(jù)符合標(biāo)準(zhǔn)正態(tài)分布,即均值為0,標(biāo)準(zhǔn)差為1 #概念 #標(biāo)準(zhǔn)化:縮放和每個(gè)點(diǎn)都有關(guān)系,通過均值μ和標(biāo)準(zhǔn)差σ體現(xiàn)出來;輸出范圍是負(fù)無窮到正無窮 #優(yōu)點(diǎn) #提升模型的收斂速度 #提升模型的精度 #使用場(chǎng)景 #如果數(shù)據(jù)存在異常值和較多噪音,用標(biāo)準(zhǔn)化,可以間接通過中心化避免異常值和極端值的影響 scaler = StandardScaler() X_train = scaler.fit_transform(X)# 2.構(gòu)建RF模型 #參數(shù)是基于個(gè)人數(shù)據(jù)優(yōu)化的結(jié)果 RFC_model = RFC(n_estimators=41,max_depth=12,max_features=1,min_samples_leaf=1,min_samples_split=14,criterion='gini') # 隨機(jī)森林 #feature_importances_基于雜質(zhì)的特征重要性 RFC_feature_importances = RFC_model.fit(X, Y).feature_importances_ # 特征重要性 print("模型特征因子重要性:") print(RFC_feature_importances)# 3.遞歸特征消除法和曲線圖選取最優(yōu)特征數(shù)量 # 建立得分列表 score = [] #range創(chuàng)建的結(jié)果不包括feature_number+1 for i in range(1, feature_number+1, 1):#fit_transform適合數(shù)據(jù),然后轉(zhuǎn)換它#為什么y不進(jìn)行分類,因?yàn)閿?shù)據(jù)的類別是事前確定的,如果更改y,那么數(shù)據(jù)就與現(xiàn)實(shí)情況不符X_transform = RFE(RFC_model, n_features_to_select=i, step=1).fit_transform(X, Y)# 交叉驗(yàn)證RFE_score = cross_val_score(RFC_model, X_transform, Y, cv=10).mean()# 交叉驗(yàn)證結(jié)果保存到列表score.append(RFE_score) print('輸出所有分類結(jié)果',score) print('輸出最優(yōu)分類結(jié)果',max(score),'對(duì)應(yīng)的特征數(shù)量', (score.index(max(score))*1)+1)# 輸出最優(yōu)分類結(jié)果和對(duì)應(yīng)的特征數(shù)量 plt.figure(figsize=[20, 5]) plt.plot(range(1, 46, 1), score) plt.xticks(range(1, 46, 1)) plt.show()# 4.遞歸特征消除法 # n_features_to_select表示篩選最終特征數(shù)量,step表示每次排除一個(gè)特征 selector1 = RFE(RFC_model, n_features_to_select=(score.index(max(score))*1)+1, step=1).fit(X, Y) #所選特征的掩碼和 print('RFE所選特征的掩碼',selector1.support_) print('RFE特征排除排序',selector1.ranking_) print('RFE選擇特征數(shù)量',selector1.n_features_) X_transform1 = selector1.transform(X) RFE_optimal_score =cross_val_score(RFC_model, X_transform1, Y, cv=10).mean() print('RFE最優(yōu)特征交叉驗(yàn)證分?jǐn)?shù)',RFE_optimal_score)# 5. 交叉驗(yàn)證遞歸特征消除法 #使用交叉驗(yàn)證進(jìn)行遞歸特征消除以選擇特征數(shù)量。 # 采用交叉驗(yàn)證,每次排除一個(gè)特征,篩選出最優(yōu)特征 selector = RFECV(RFC_model, step=1, cv=10) selector = selector.fit(X, Y) RFECV_X_transform = selector.transform(X) # 最優(yōu)特征分類結(jié)果 RFECV_optimal_score =cross_val_score(RFC_model , RFECV_X_transform, Y, cv=10).mean() print('RFECV最優(yōu)特征交叉驗(yàn)證分?jǐn)?shù)',RFECV_optimal_score) print("最佳數(shù)量和排序") print('RFECV選取結(jié)果',selector.support_) print('RFECV選取特征數(shù)量',selector.n_features_) print('RFECV依次排數(shù)特征排序',selector.ranking_)總結(jié)
以上是生活随笔為你收集整理的python特征递归消除的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 申购转债好不好?可转债申购多少合适
- 下一篇: python 中文apichm_pyth