第21步 机器学习分类实战:Logistic回归建模(下)


前言

我们继续


二、SPSSPRO调参

介绍一款傻瓜软件,SPSSPRO,过适合快速建模。

下载网址:https://www.spsspro.com/client/

(1)正常安装,打开软件:
在这里插入图片描述
(2)扫码注册或者登陆:
在这里插入图片描述
(3)新建分析项目——上传文件(要分析的数据)——开始处理:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(3)左边有一些功能,大家自行探索了,我们直接点击数据分析去建模:
在这里插入图片描述
(4)点击左边“机器学习分类”——“逻辑回归”:
在这里插入图片描述

(5)按照下图操作吧:

在这里插入图片描述
在这里插入图片描述

(6)其他默认,点开始分析试试,输出一系列结果,惨不忍睹:

在这里插入图片描述

在这里插入图片描述
(7)再继续调整一下参数,比如设置“数据洗牌”,点击“更多设置”,自动寻找参数功能,大家自己探索了,我随便搞搞:

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

结果如下:

在这里插入图片描述
在这里插入图片描述

总结一下:用SPSSPRO输出的测试结果跟python差不多,都是准确率81%左右;还提供其他结果,不过呢,相对局限,毕竟AUC和ROC没看到。还是老老实实学python吧。

三、模型评价

SPSSPRO只是娱乐娱乐,快速建模初步看看,发文章还得回归python呀。
直接丢出代码了哈:

(A)混淆矩阵及其可视化:

y_pred = classifier.predict(X_test)
y_testprba = classifier.predict_proba(X_test)[:,1] 
y_trainpred = classifier.predict(X_train)
y_trainprba = classifier.predict_proba(X_train)[:,1]

from sklearn.metrics import confusion_matrix
cm_test = confusion_matrix(y_test, y_pred)
cm_train = confusion_matrix(y_train, y_trainpred)
print(cm_train)
print(cm_test)

#绘画测试集混淆矩阵
classes = list(set(y_test))
classes.sort()
plt.imshow(cm_test, cmap=plt.cm.Blues)
indices = range(len(cm_test))
plt.xticks(indices, classes)
plt.yticks(indices, classes)
plt.colorbar()
plt.xlabel('guess')
plt.ylabel('fact')
for first_index in range(len(cm_test)):
    for second_index in range(len(cm_test[first_index])):
        plt.text(first_index, second_index, cm_test[first_index][second_index])
plt.show()
#绘画训练集混淆矩阵
classes = list(set(y_train))
classes.sort()
plt.imshow(cm_train, cmap=plt.cm.Blues)
indices = range(len(cm_train))
plt.xticks(indices, classes)
plt.yticks(indices, classes)
plt.colorbar()
plt.xlabel('guess')
plt.ylabel('fact')
for first_index in range(len(cm_train)):
    for second_index in range(len(cm_train[first_index])):
        plt.text(first_index, second_index, cm_train[first_index][second_index])
plt.show()  

(B)灵敏度、特异度等数值型指标:

import math
from sklearn.metrics import confusion_matrix,roc_auc_score,auc,roc_curve
cm = confusion_matrix(y_test, y_pred)    
cm_train = confusion_matrix(y_train, y_trainpred)
#测试集的参数
a = cm[0,0]
b = cm[0,1]
c = cm[1,0]
d = cm[1,1]
acc = (a+d)/(a+b+c+d)
error_rate = 1 - acc
sen = d/(d+c)
sep = a/(a+b)
precision = d/(b+d)
F1 = (2*precision*sen)/(precision+sen)
MCC = (d*a-b*c) / (math.sqrt((d+b)*(d+c)*(a+b)*(a+c)))
auc_test = roc_auc_score(y_test, y_testprba) 
#训练集的参数
a_train = cm_train[0,0]
b_train = cm_train[0,1]
c_train = cm_train[1,0]
d_train = cm_train[1,1]
acc_train = (a_train+d_train)/(a_train+b_train+c_train+d_train)
error_rate_train = 1 - acc_train
sen_train = d_train/(d_train+c_train)
sep_train = a_train/(a_train+b_train)
precision_train = d_train/(b_train+d_train)
F1_train = (2*precision_train*sen_train)/(precision_train+sen_train)
MCC_train = (d_train*a_train-b_train*c_train) / (math.sqrt((d_train+b_train)*(d_train+c_train)*(a_train+b_train)*(a_train+c_train)))
auc_train = roc_auc_score(y_train, y_trainprba) 

保姆级解读

1、还记得怎么通过混淆矩阵计算灵敏度、特异度等指标么?
在这里插入图片描述
首先获得a、b、c、d,怎么搞呢?a是不是第一行第一列,对于python来说:就是第零行第零列(a = cm[0,0]),以此类推,读取b、c、d。
然后根据a、b、c、d包打天下,例如:
灵敏度是真实值是1中,模型预测也为1的正确比例:sen = d/(d+c);
特异度是真实值是0中,模型预测也为0的正确比例:sep = a/(a+b);
其他的计算方式就不演示了。

2、此外,AUC的计算不依赖于a、b、c、d,而是根据这个代码:
auc_test = roc_auc_score(y_test, y_testprba)
roc_auc_score的参数呢,包括两个:y_test是实际值,y_testprba是预测的概率(注意,是概率,而不是分类,要和y_pred做区别),来看看代码:

y_pred = classifier.predict(X_test)
y_testprba = classifier.predict_proba(X_test)[:,1] 

来,一个是predict,一个是predict_proba,输出的如图所示。
在这里插入图片描述
一目了然了吧,就是根据0.5为阈值进行分类的。我们也可以根据这个表,找出被误判的样本,这个后面再说了。

3、对了,小白估计不知道这些参数去哪里看,还是多说一句吧:
在这里插入图片描述
在这里插入图片描述

(C)ROC曲线:

#绘画训练集ROC曲线
fpr_train, tpr_train, thresholds_train = roc_curve(y_train, y_trainprba, pos_label=1, drop_intermediate=False)  
plt.plot([0, 1], [0, 1], '--', color='navy')     
plt.plot(fpr_train, tpr_train, 'k--',label='Mean ROC (area = {0:.4f})'.format(auc_train), lw=2,color='darkorange')
plt.xlim([-0.01, 1.01])  
plt.ylim([-0.01, 1.01])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate') 
plt.title('Please replace your title')
plt.legend(loc="lower right")
plt.show()

#绘画测试集ROC曲线
fpr_train, tpr_train, thresholds_train = roc_curve(y_test, y_testprba, pos_label=1, drop_intermediate=False) 
plt.plot([0, 1], [0, 1], '--', color='navy')     
plt.plot(fpr_train, tpr_train, 'k--',label='Mean ROC (area = {0:.4f})'.format(auc_test), lw=2,color='darkorange')
plt.xlim([-0.01, 1.01]) 
plt.ylim([-0.01, 1.01])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate') 
plt.title('Please replace your title')
plt.legend(loc="lower right")
plt.show()

保姆级解读

1、还记得ROC曲线的绘制原理么?传送门
简单复习一下要点:指定一个阈值为90%,那么只有第一个样本(90%)会被归类为正例,而其他所有样本都会被归为负例,因此,对于90%这个阈值,我们可以计算出FPR为0,TPR为0.1(因为总共10个正样本,预测正确的个数为1),那么曲线上必有一个点为(0, 0.1)。依次选择不同的阈值(或称为“截断点”),画出全部的关键点以后,再连接关键点即可最终得到ROC曲线。
所以要绘制ROC曲线,必须要获得三个数据:假阳性率(fpr),真阳性率(tpr), 阈值(thresholds),python有一个代码直接给出结果:

fpr_train, tpr_train, thresholds_train = roc_curve(y_train, y_trainprba, pos_label=1, drop_intermediate=False)

也就是roc_curve函数,需要的参数有y_train(真实值), y_trainprba(预测的概率,没错是概率,否则就是三个点的图),pos_label=1(告诉软件正类我们赋值为1),drop_intermediate=False就不用管他了。

2、我们来看一看具体输出了啥:
在这里插入图片描述
来看看当阈值为0.5时,灵敏度是0.676692,特异度是1-0.127072=0.872928,是不是呢?我们找一下之前计算的结果(这里都是算测试集的哈):
在这里插入图片描述
没错吧,这都对应上了,进一步验证我们的代码和结果应该是没错的。

(D)PR曲线:
上代码:

#绘画测试集PR曲线
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve, average_precision_score
precision_1, recall_1, thresholds = precision_recall_curve(y_test, y_testprba)
plt.step(recall_1, precision_1, color='darkorange', alpha=0.2,where='post')
plt.fill_between(recall_1, precision_1, step='post', alpha=0.2,color='darkorange')
plt.figure("P-R Curve")
plt.title('Precision/Recall Curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.plot(recall_1,precision_1)
plt.show()
AP_test = average_precision_score(y_test, y_testprba, average='macro', pos_label=1, sample_weight=None)

#绘画训练集PR曲线
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve, average_precision_score
precision_1, recall_1, thresholds = precision_recall_curve(y_train, y_trainprba)
plt.step(recall_1, precision_1, color='darkorange', alpha=0.2,where='post')
plt.fill_between(recall_1, precision_1, step='post', alpha=0.2,color='darkorange')
plt.figure("P-R Curve")
plt.title('Precision/Recall Curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.plot(recall_1,precision_1)
plt.show()
AP_train = average_precision_score(y_train, y_trainprba, average='macro', pos_label=1, sample_weight=None)

保姆级解读

为何要PR曲线?简单来说,对于不平衡数据,PR曲线是敏感的,随着正负样本比例的变化,PR会发生强烈的变化。而ROC曲线是不敏感的,其曲线能够基本保持不变。“在negative instances的数量远远大于positive instances的数据集里,PR更能有效衡量分类器的好坏。”
具体区别和原理见此网站科普:
https://blog.csdn.net/weixin_31866177/article/details/88776718
统一在这里放出输出:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

各位好好消化~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jet4505

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值