银行客户交易行为预测:特征分析

机器学习训练营——机器学习爱好者的自由交流空间(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是更有效的预测变量。

未完待续

    原文作者:银行家问题
    原文地址: https://blog.csdn.net/wong2016/article/details/88726012
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞