數據分析系列——數據分析入門(十五)
系列學習內容來自DC學院(首頁-專業的大數據在線課程學習平台-DC學院,如果有小夥伴對平台上的課程感興趣,可以在評論區留言或者私信我「邀請碼」,通過邀請報名九折優惠),非原創,特此註明。一方面,幫助自己理清學習框架;另一方面,課程有時間限制,做好筆記,以便後續繼續學習。
預測型數據分析:用特徵選擇方法優化模型
如何從訓練集中挑選最合適的子集作為訓練模型時所用的特徵,使最終得到的模型的預測準確率最高。
特徵選擇(Feature Selection):從已有的M個特徵中選擇N個特徵使得系統的特定指標最優化,是從原始特徵中選擇出一些最有效的特徵以降低數據維度的過程,是提高學習演算法性能的一個重要手段,也是模式識別中關鍵的數據預處理步驟。對於一個學習演算法來說,好的學習樣本是訓練模型的關鍵。
1.特徵選擇的方法
數據驅動:分析已有的訓練數據,找出哪些X裡面的特徵對預測y最重要,主要方法有:
(1)相關性:考察特徵x與預測值y的相關度
(2)迭代刪除(增加):確定使用哪個演算法後,選擇最合適的訓練子集,得到效果最好的模型
(3)基於模型:通過隨機森林等可以直接得出每個訓練特徵的重要性的模型;或者在進行預測時加入的一些正則化調整,引起的對特徵的篩選,從而挑出最重要的特徵。
領域專家:通過相關領域的專家知識、經驗來挑選特徵
2. 相關性係數:皮爾遜係數
(1)定義:在統計學中,皮爾遜積矩相關係數用於度量兩個變數X和Y的相關性,其值介於-1與1之間。公式為:
python實現:
from scipy.stats.stats import pearsonrpearsonr(x,y)
3. 迭代特徵選擇
解決的問題:確定合適的子集合作為特徵訓練模型
解決方案:
(1)暴力解法:把所有可能的特徵組合都試一遍,用交叉檢驗看哪個特徵子集的預測效果好
(2)遞增:
(3)遞減
4. 迭代特徵選擇的python實現
遞增:
import pandasimport numpy as npfrom sklearn import linear_modelfrom sklearn.model_selection import cross_val_scorefrom sklearn.preprocessing import LabelEncoderiris =pandas.read_csv(http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data,header=None)iris.columns=[SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species]le=LabelEncoder()le.fit(iris[Species])lm=linear_model.LogisticRegression()#模型可以換features=[PetalLengthCm,PetalWidthCm,SepalLengthCm,SepalWidthCm]y=le.transform(iris[Species])selected_features=[]rest_features=features[:]#深度複製,此時rest_features和features在內存中指向的空間是不一樣的,修改rest_features的時候不會影響featuresbest_acc=0#記錄當前模型的準確度while len(rest_features)>0 temp_best_i= temp_best_acc=0 for feature_i in rest_features: temp_features=selected_features+[feature_i,] x=iris[temp_features] scores=cross_val_score(lm,x,y,cv=5,scoring=accuracy) acc=np.mean(scores) if acc > temp_best_acc: temp_best_acc=acc temp_best_i=feature_i print("select",temp_best_i,"acc:",temp_best_acc) if temp_best_acc>best_acc: best_acc=temp_best_acc selected_features+=[temp_best_i,] rest_features.remove(temp_best_i) else: breakprint("best feature set:",selected_features,"acc:",best_acc)
遞減:
import pandasimport numpy as npfrom sklearn import linear_modelfrom sklearn.model_selection import cross_val_scorefrom sklearn.preprocessing import LabelEncoderiris =pandas.read_csv(http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data,header=None)iris.columns=[SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species]le=LabelEncoder()le.fit(iris[Species])lm=linear_model.LogisticRegression()#模型可以換features=[PetalLengthCm,PetalWidthCm,SepalLengthCm,SepalWidthCm]#X=featuresy=le.transform(iris[Species])selected_features=features[:]print(selected_features)remove_features=[]best_acc=np.mean(cross_val_score(lm,iris[selected_features],y,cv=5,scoring=accuracy))print(best_acc)while len(selected_features)>0: temp_selected_features=selected_features[:] temp_remove_i= temp_best_acc=np.mean(cross_val_score(lm,iris[ temp_selected_features],y,cv=5,scoring=accuracy)) print(temp_best_acc) for feature_i in temp_selected_features: #print(feature_i) temp_selected_features.remove(feature_i) #print(selected_features) x=iris[temp_selected_features] scores=cross_val_score(lm,x,y,cv=5,scoring=accuracy) acc=np.mean(scores) print(selected_features) #print(acc) if acc > temp_best_acc: temp_best_acc=acc temp_remove_i=feature_i[:] print(selected_features) print(temp_remove_i) print("remove",temp_remove_i,"acc:",temp_best_acc) if temp_best_acc>best_acc: best_acc=temp_best_acc remove_features+=[temp_remove_i,] selected_features=selected_features.remove(temp_remove_i) else: breakprint("best feature set:",selected_features,"acc:",best_acc)
除了上述方法,還有一些基於模型的優化方法,將在下一節介紹。
待續~
推薦閱讀:
※數據分析思維三部曲
※面試官最喜歡數據分析能力強的人。
※工藝轉行數據分析的分析報告
※我要買房子,想用數據分析試試
※數據分析指北 (基礎之三從"完備"到基礎操作 select)