PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享(下)

简介: PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享

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 没有太大帮助。

相关文章
|
5月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
5月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
6月前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
121 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
7月前
|
机器学习/深度学习 算法
【机器学习】SVM面试题:简单介绍一下SVM?支持向量机SVM、逻辑回归LR、决策树DT的直观对比和理论对比,该如何选择?SVM为什么采用间隔最大化?为什么要将求解SVM的原始问题转换为其对偶问题?
支持向量机(SVM)的介绍,包括其基本概念、与逻辑回归(LR)和决策树(DT)的直观和理论对比,如何选择这些算法,SVM为何采用间隔最大化,求解SVM时为何转换为对偶问题,核函数的引入原因,以及SVM对缺失数据的敏感性。
132 3
|
7月前
|
机器学习/深度学习 运维 算法
深入探索机器学习中的支持向量机(SVM)算法:原理、应用与Python代码示例全面解析
【8月更文挑战第6天】在机器学习领域,支持向量机(SVM)犹如璀璨明珠。它是一种强大的监督学习算法,在分类、回归及异常检测中表现出色。SVM通过在高维空间寻找最大间隔超平面来分隔不同类别的数据,提升模型泛化能力。为处理非线性问题,引入了核函数将数据映射到高维空间。SVM在文本分类、图像识别等多个领域有广泛应用,展现出高度灵活性和适应性。
294 2
|
7月前
|
机器学习/深度学习 算法
【机器学习】解释对偶的概念及SVM中的对偶算法?(面试回答)
解释了对偶的概念,指出对偶性在优化问题中的重要性,尤其是在强对偶性成立时可以提供主问题的最优下界,并且详细阐述了支持向量机(SVM)中对偶算法的应用,包括如何将原始的最大间隔优化问题转换为对偶问题来求解。
142 2
|
7月前
|
机器学习/深度学习 算法
【机器学习】支持向量机SVM、逻辑回归LR、决策树DT的直观对比和理论对比,该如何选择(面试回答)?
文章对支持向量机(SVM)、逻辑回归(LR)和决策树(DT)进行了直观和理论上的对比,并提供了在选择这些算法时的考虑因素,包括模型复杂度、损失函数、数据量需求、对缺失值的敏感度等。
108 1
|
7月前
|
机器学习/深度学习 算法 Python
python与朴素贝叶斯算法(附示例和代码)
朴素贝叶斯算法以其高效性和优良的分类性能,成为文本处理领域一项受欢迎的方法。提供的代码示例证明了其在Python语言中的易用性和实用性。尽管算法假设了特征之间的独立性,但在实际应用中,它仍然能够提供强大的分类能力。通过调整参数和优化模型,你可以进一步提升朴素贝叶斯分类器的性能。
193 0
|
8月前
|
机器学习/深度学习 数据采集 数据可视化
Python实现支持向量机SVM分类模型线性SVM决策过程的可视化项目实战
Python实现支持向量机SVM分类模型线性SVM决策过程的可视化项目实战
Python实现支持向量机SVM分类模型线性SVM决策过程的可视化项目实战
|
7月前
|
机器学习/深度学习 数据可视化 算法
【Python支持向量机】Python客户银行贷款支持向量机数据分析可视化SVM(源码+数据集+报告)【独一无二】
【Python支持向量机】Python客户银行贷款支持向量机数据分析可视化SVM(源码+数据集+报告)【独一无二】

热门文章

最新文章