在模型開發(fā)中程腹,并不是所有的特征要全部篩選進模型,因為金融數(shù)據(jù)一般特征有很多焕数,如果全部放入模型纱昧,一方面可能會引起“維度災難”,另一方面得到的結(jié)果也許并不是最好的堡赔,因為有些特征之間的相關(guān)性較強识脆。所以我們有必要對特征進行一定程度的篩選.數(shù)據(jù)的話可以去評分卡模型開發(fā)-數(shù)據(jù)集缺失值處理下載
import pandas as pd
import os
os.chdir("C:\\Users\\Administrator\\OneDrive\\步履不停\\評分卡制作\\數(shù)據(jù)")
df = pd.read_csv(".\\GermanCredit.csv",index_col=0)
df.head()
#將違約樣本用"1"表示,正常樣本用0表示
import numpy as np
df['credit_risk'] = df['credit_risk'].apply(lambda x:np.where(x=='good',0,1))
#獲取定量指標
df.info()
continuous_vars = []
category_vars = []
for i in df.columns:
if df[i].dtype=='int64': #判斷條件依據(jù)df.info()的結(jié)果而定
continuous_vars.append(i)
else:
category_vars.append(i)
X = df.loc[:,continuous_vars[:-1]]
X.head()
y = df.loc[:,continuous_vars[-1]]
y.head()
至此善已,我們將數(shù)據(jù)源中的所有特征分為了定量和定性灼捂,接下來我們講講怎么在python中選取定量特征
- 通過隨機森林判斷特征的重要性
from sklearn.ensemble import RandomForestClassifier
#無需對基于樹的模型做標準化或歸一化處理
forest = RandomForestClassifier(n_estimators=10000,random_state=0,n_jobs=-1)
forest.fit(X,y)
importances=forest.feature_importances_
importances
得到如下結(jié)果:
array([ 0.18996948, 0.34514053, 0.06920705, 0.07587584, 0.2470823 ,
0.04564897, 0.02707582])
接下來我們利用numpy中argsort函數(shù)得到imoortances中從大到小排列的索引值,并根據(jù)索引值將每個特征的重要性值排列出來
indices=np.argsort(importances)[::-1]
feat_labels=X.columns
for f in range(X.shape[1]):
print("%2d) %-*s %f " %(f+1,30,feat_labels[f],importances[indices[f]]))
得到如下結(jié)果:該結(jié)果是根據(jù)均值精度下降法得出來的
1) duration 0.345141
2) amount 0.247082
3) installment_rate 0.189969
4) present_residence 0.075876
5) age 0.069207
6) number_credits 0.045649
7) people_liable 0.027076
最后我們可以將其可視化:
import matplotlib.pyplot as plt
%matplotlib inline
plt.title('Feature Importances')
plt.bar(range(X.shape[1]),importances[indices],color='lightblue',align='center')
plt.xticks(range(X.shape[1]),feat_labels,rotation=90)
plt.xlim([-1,X.shape[1]])
plt.tight_layout()
- 還有一些其他的特征選擇方法可以參考這個:http://scikit-learn.org/stable/modules/feature_selection.html,里面有詳細的介紹