机器学习训练营——机器学习爱好者的自由交流空间(qq群号:696721295)
数据预处理
缺失数据检查
我们定义一个函数check_missing_data
, 它的作用是检查训练集与检验集里是否有缺失值。
def check_missing_data(df):
flag=df.isna().sum().any()
if flag==True:
total = df.isnull().sum()
percent = (df.isnull().sum())/(df.isnull().count()*100)
output = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
data_type = []
# written by MJ Bahmani
for col in df.columns:
dtype = str(df[col].dtype)
data_type.append(dtype)
output['Types'] = data_type
return(np.transpose(output))
else:
return(False)
print(check_missing_data(train)), print(check_missing_data(test))
结果显示,数据集里没有缺失值。
二值分类
print(train['target'].unique())
我们看到,目标变量target
是一个0-1型的二值变量,它表示银行客户是否有交易行为。
平衡问题
我们统计一下target
取0, 1的个数和比例。
def check_balance(df,target):
check=[]
# written by MJ Bahmani for binary target
print('size of data is:',df.shape[0] )
for i in [0,1]:
print('for target {} ='.format(i))
print(df[target].value_counts()[i]/df.shape[0]*100,'%')
print(train['target'].value_counts())
check_balance(train,'target')
我们发现,target
是不平衡的,0值占绝大多数,约占总数的90%.
偏度与峰度
#skewness and kurtosis
print("Skewness: %f" % train['target'].skew())
print("Kurtosis: %f" % train['target'].kurt())
特征工程
在这一部分,我们将对数据集的特征作筛选、变换、加工,为下一步的数据建模作准备。通过前面的分析发现,所有特征的名字都是没有意义的,而每个特征的重要性也不同。我们想找到有意义的特征,对模型预测有价值的特征。
置换重要性
这一节我们将回答以下两个问题:
哪些特征对预测影响最大?
怎样从模型里提取理解知识?
准备好要分析的数据集。
cols=["target","ID_code"]
X = train.drop(cols,axis=1)
y = train["target"]
X_test = test.drop("ID_code",axis=1)
为了计算哪些特征是更重要的,将训练集分割成训练集与检验集两部分,在训练集上建立随机森林分类器。
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)
rfc_model = sklearn.ensemble.RandomForestClassifier(random_state=0).fit(train_X, train_y)
计算与显示特征重要性
这里我们需要导入ELI5
库,它是一个Python库,用来调试机器学习分类器并解释它们的预测。
import eli5
from eli5.sklearn import PermutationImportance
perm = PermutationImportance(rfc_model, random_state=1).fit(val_X, val_y)
eli5.show_weights(perm, feature_names = val_X.columns.tolist(), top=150)
结果显示每个特征的权值,特征的重要性依权值下降。其中的绿色特征表示对预测有正影响;白色特征表示对预测没有影响;红色特征表示对预测有负影响。根据权值,最重要的特征是Var_110
.
部分依赖图
“特征重要性”显示哪些特征影响预测,而部分依赖图(partial dependence plots
)显示特征怎样影响预测。由于部分依赖图是在一个模型拟合后才计算的,所以我们拟合一个决策树。
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)
tree_model = DecisionTreeClassifier(random_state=0, max_depth=5, min_samples_split=5).fit(train_X, train_y)
features = [c for c in train.columns if c not in ['ID_code', 'target']]
from sklearn import tree
import graphviz
tree_graph = tree.export_graphviz(tree_model, out_file=None, feature_names=features)
graphviz.Source(tree_graph)
从决策树上分析出,特征Var_81
是更有效的预测变量。
未完待续