PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享(上):https://developer.aliyun.com/article/1492254
基于对我们有用的 WOE 分析变量是:pdays、previous、job、housing、balance、month、duration、poutcome、contact。
在下一步中,我们决定根据 WOE 结果和变量的先前结果删除无用的列。
我们删除的其中一个列是 poutcome,尽管它的 WOE 很高,但我们决定删除它,因为从 prevois 分析中我们看到它有许多未知的观察结果。
在可变持续时间的情况下,我们也可以看到WOE相当大,甚至可以说这个结果有点可疑。我们决定根据 WOE 结果放弃它,因为我们的模型应该根据过去的数据说明是否建议给某个人打电话。
在可变接触的情况下,我们放弃了它,因为对我们来说,接触形式在我们的模型中没有用。
我们还删除了变量 day 因为它对我们没有用,因为这个变量代表天数,而该变量的 WOE 非常小。我们删除的最后一个变量是变量 pdays,尽管这个变量 WOE 的结果非常好,但它对我们来说并不是一个有用的变量。
我们分析中剩下的列:
特征选择和工程
要执行我们的算法,我们首先需要将字符串更改为二进制变量。
data = pd.get_dummies(data=data, columns = \['job', 'marital', 'education' , 'month'\], \ prefix = \['job', 'marital', 'education' , 'month'\])
我们更改了列的名称。
data.head(5)
创建虚拟变量后,我们进行了 Pearson 相关。
age = pearsonr(data\['age'\], data\['y'\])
sns.heatmap(corr
我们选择了数字列来检查相关性。正如我们所看到的,没有相关性。
我们查看因变量和连续变量之间的关系。
pylab.show()
交叉验证
经过所有准备工作,我们终于可以将数据集拆分为训练集和测试集。
算法的实现
逻辑回归
K=5 kf = KFold(n_splits=K, shuffle=True) logreg = LogisticRegression()
\[\[7872 93\] \[ 992 86\]\]
\[\[7919 81\] \[ 956 86\]\]
\[\[7952 60\] \[ 971 59\]\]
\[\[7871 82\] \[1024 65\]\]
\[\[7923 69\] \[ 975 75\]\]
决策树
dt2 = tree.DecisionTreeClassifier(random\_state=1, max\_depth=2)
\[\[7988 0\] \[1055 0\]\]
\[\[7986 0\] \[1056 0\]\]
\[\[7920 30\] \[1061 31\]\]
\[\[8021 0\] \[1021 0\]\]
\[\[7938 39\] \[1039 26\]\]
随机森林
random_forest = RandomForestClassifier
\[\[7812 183\] \[ 891 157\]\]
\[\[7825 183\] \[ 870 164\]\]
\[\[7774 184\] \[ 915 169\]\]
\[\[7770 177\] \[ 912 183\]\]
\[\[7818 196\] \[ 866 162\]\]
KNN近邻
classifier = KNeighborsClassifier(n_neighbors =13,metric = 'minkowski' , p=2) print("Mean accuracy: ",accuracyknn/K) print("The best AUC: ", bestaucknn)
\[\[7952 30\] \[1046 15\]\]
\[\[7987 30\] \[1010 15\]\]
\[\[7989 23\] \[1017 13\]\]
\[\[7920 22\] \[1083 17\]\]
\[\[7948 21\] \[1052 21\]\]
高斯朴素贝叶斯
kf = KFold(n_splits=K, shuffle=True) gaussian = GaussianNB()
\[\[7340 690\] \[ 682 331\]\]
\[\[7321 633\] \[ 699 389\]\]
\[\[7291 672\] \[ 693 386\]\]
\[\[7300 659\] \[ 714 369\]\]
\[\[7327 689\] \[ 682 344\]\]
`````` models = pd.DataFrame({ 'Model': \['KNN', 'Logistic Regression', 'Naive Bayes', 'Decision Tree','Random Forest'\], 'Score': \[ accuracyknn/K, accuracylogreg/K, accuracygnb/K, accuracydt/K, accuracyrf/K\], 'BestAUC': \[bestaucknn,bestauclogreg,bestaucgnb, bestaucdt,bestaucrf\]})
我们看到根据 AUC 值的最佳模型是朴素贝叶斯我们不应该太在意最低的 R2 分数,因为数据非常不平衡(很容易预测 y=0)。在混淆矩阵中,我们看到它预测了漂亮的价值真正值和负值。令我们惊讶的是,决策树的 AUC 约为 50%。
欠采样
我们尝试对变量 y=0 进行欠采样
gTrain, gValid = train\_test\_split
逻辑回归
predsTrain = logreg.predict(gTrainUrandom)
predsTrain = logreg.predict(gTrain20Urandom)
predsTrain = logreg.predict(gTrrandom)
决策树
print("Train AUC:", metrics.roc\_auc\_score(ygTrds))
随机森林
print("Train AUC:", metrics.roc\_auc\_score(ygTr, predsTrain), "Valid AUC:", metrics.roc\_auc\_score(ygVd, preds))
KNN近邻
print("Train AUC:", metrics.roc\_auc\_score(ygTrm, predsTrain), "Valid AUC:", metrics.roc\_auc\_score(ygVal10, preds))
高斯朴素贝叶斯
print("Train AUC:", metrics.roc\_auc\_score(ygTraom, predsTrain), "Valid AUC:", metrics.roc\_auc\_score(ygid, preds))
过采样
我们尝试对变量 y=1 进行过采样
feates = datolist() print(feures) feaes.remove('y')
print(gTrainOSM.shape)
(31945, 39) `````` smt = SMOT
(32345, 39) `````` smt = SMOT
(32595, 39) `````` ygTrain10OSM=gTrain10OSM\['y'\] gTrain10OSM=gTrain10OSM.drop(columns=\['y'\])
逻辑回归
print("Train AUC:", metrics.roc\_auc\_score(ygTrin10SM, predsTrain), "Valid AUC:", metrics.roc\_auc\_score(ygValid, preds))
决策树
dt2.fit(,ygTranOS) predsTrain = dtpreict(TrainOSM) preds = dt2.predict(gValid)
随机森林
random_forest.fit(rainOSM, ygTranOS) predsTrain = random_forest.prect(gTraiOSM) p
KNN近邻
classifier.fit(granOSM, yTanOSM) predsTrain = classifier.predict(gTaiSM) preds = classifier.predict(Vaid)
高斯朴素贝叶斯
gaussian.fit(gTriOM, ygrainM) predsTrain = gaussian.predcti)
结论
我们看到欠采样和过采样变量 y 对 AUC 没有太大帮助。