目录
1.具体案例执行(参考某位大佬)
前期数据处理
评价指标计算
【混淆矩阵】
【准确率】
【精确率】
【召回率】
【F1 score】
【P-R曲线】
【ROC】
【AUC】
2.在训练集上获取坏账率
3.官方代码执行
1.pycharm平台项目创建
2.数据存储和读取
2.1查看样例数据
2.2查看训练+测试数据
2.3 分类指标评价计算示例
1.具体案例执行(参考某位大佬)该栗子是利用iris数据集进行小测试的
前期数据处理导入包sklearn+数据加载+数据读取(输入X+标签y)+逻辑回归函数拟合+模型预测值y_hat
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
# 加载iris数据集
iris = load_iris()
#输入+标签
X,y = iris.data,iris.target
#用逻辑回归函数进行拟合
lr_clf = LogisticRegression(random_state=1)
lr_clf.fit(X,y)
#模型预测值
y_hat = lr_clf.predict(X)
评价指标计算
【混淆矩阵】
#混淆矩阵
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y,y_hat))
【打印输出】
【真实输出】
#准确率
from sklearn.metrics import accuracy_score
score = accuracy_score(y,y_hat)
print(accuracy_score(y,y_hat,normalize=False),int(150 * score))
#精确率(average参数选了三种模式)
from sklearn.metrics import precision_score # 必须要为二分类
print(precision_score(y, y_hat,average=None))
print(precision_score(y,y_hat, average='macro'))
import numpy as np
print(np.mean(precision_score(y, y_hat,average=None)))# 等同于 macro模 式
print(precision_score(y,y_hat, average='micro'))
#召回率
from sklearn.metrics import recall_score
print(recall_score(y, y_hat, average=None))
#F1 score
from sklearn.metrics import f1_score
print(f1_score(y, y_hat, average=None))
#此处的栗子只是展示,不是数据集的
from sklearn.metrics import precision_recall_curve
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
precision, recall, thresholds = precision_recall_curve(y_true, y_scores)
print(precision,recall,thresholds)#不分开的话就是在一行
【额外补充】
y_score = lr_clf.decision_function(X) # 打印出样本的置信度
print(y_score)
from sklearn.metrics import average_precision_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print(average_precision_score(y_true, y_scores))
【额外补充PR示例】
#额外示例-使用线性SVC
from sklearn.datasets import make_classification
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import plot_precision_recall_curve#导入这个就可以为图自动添加一些信息(横坐标+纵坐标+图例-值(这个值是自动取了约数,小数点后两位)名称),另外打印图时语句更简洁
import matplotlib.pyplot as plt
from sklearn.metrics import average_precision_score
X,y = make_classification(n_samples=200, n_features=20,n_informative=2, n_classes=2,shuffle=True)
print(X.shape, y.shape)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3, shuffle=False)
svc = LinearSVC(random_state=2)
svc.fit(X_train,y_train)
y_score = svc.decision_function(X_test) # 搞懂这个是啥意思
average_precision = average_precision_score(y_test, y_score)
print('Average precision-recall score: {0:0.2f}'.format(
average_precision))
disp = plot_precision_recall_curve(svc,X_test, y_test)
disp.ax_.set_title('2-class Precision-Recall curve:AP={0:0.2f}'.format(average_precision))#添加标题,并将上面计算的平均精度展示在这里
plt.show()#不可省
其中图的各种信息自动添加的
【ROC】#ROC,基于前面的线性SVC示例
from sklearn.metrics import roc_auc_score,roc_curve
print(roc_auc_score(y_test,y_score,average=None))
fpr,tpr,thresholds = roc_curve(y_test, y_score)
from sklearn.metrics import plot_roc_curve
plot_roc_curve(svc,X_test,y_test,drop_intermediate=False)
plt.show()
#AUC,基于前面ROC做出的
from sklearn.metrics import auc
print(auc(fpr,tpr))
应用一个业务概念,所谓贷款等级指贷款申请前风险模型评分。那么只要模型还靠谱,其结果就有一定区分度。 于是我们使用变量:subGrade,贷款等级之子级
参考:https://github.com/IvanaXu/TianChiProj/tree/master/TestRisk?spm=5176.12282029.0.0.44f75dc2JWFLCL
import pandas as pd
import numpy as np
#dt = "/Users/ivan/Desktop/ALL/Data/TestRisk"
#dtrai = pd.read_csv(f"{dt}/train.csv")
dtrai = pd.read_csv('finance/train.csv')
#dtest = pd.read_csv(f"{dt}/testA.csv")
dtest = pd.read_csv('finance/testA.csv')
dtrai["req"] = dtrai.subGrade
dtest["req"] = dtest.subGrade
print(pd.value_counts(dtrai.isDefault))
_ = pd.crosstab(dtrai.req, dtrai.isDefault)
_["yp"] = _[0]/(_[0]+_[1])
_.reset_index(inplace=True)
_.sort_values(by="yp", inplace=True)
print(_[["req", "yp"]])
_r = pd.merge(dtest[["id", "req"]], _[["req", "yp"]], on="req", how="left")
_r["isDefault"] = [round(_,6) for _ in _r["yp"]]
_r.sort_values(by="id", inplace=True)
#_r[["id", "isDefault"]].to_csv(f"{dt}/outs/submit.csv", index=None)
#[["id", "isDefault"]].to_save('finance/submit.csv', index=None)#此句不对,不晓得怎么保存
print(_r[["id", "isDefault"]].head())
3.官方代码执行
1.pycharm平台项目创建
创建项目FinancialRiskControlGame-虚拟环境-安装包pandas,发现安装后出现了一些额外的第三方包,如numpy,因为下面评价指标会用到这个包,就省去了安装
创建数据路径并存放,然后对三个数据集进行读取查看等
2.1查看样例数据【代码】
import pandas as pd
#----查看样例
path = 'finance/sample_submit.csv'
sample_data = pd.read_csv(path)
print(sample_data.shape)
#sample_data.head()
print(sample_data.head())
【head函数】
Pycharm运行时默认读取到的是前五行,关于属性,是默认读取的是前五列+后五列
【遇到问题:pycharm中pandas读取csv运行head方法无显示结果?】
解决:pycharm或是一般的ide都是把输出到系统的标准流中,如果要在ide中显示得用print方法打印在ide中,所以应该是print(data.head())
参考:https://www.zhihu.com/question/318903567
【修改后输出结果】
【代码】
train = pd.read_csv('finance/train.csv')
testA = pd.read_csv('finance/testA.csv')
print('Train data shape:',train.shape)
print('TestA data shape:',testA.shape)
print(train.head())#默认输出的也是前五行
print(testA.head())
【运行结果】
【训练集补充查看】
#---选择训练集类别属性观察
class_data = train.select_dtypes(include=['object'])
print(class_data.head(5))#只观察前五行
#---选择训练集数值属性观察
numeric_data = train.select_dtypes(include=["number"])
print(numeric_data.head(5))
评价指标计算的是模型预测的值y_pred和真实值y_true之间的一个关系值。评价指标用的都是sklearn包里的各种函数,因此需要使用此第三方包。在导入包时,发现有下划线-红线出现,因此需要安装sklearn包。
【安装包sklearn】
安装的全名是:scikit-learn/sklearn(之前直接安装后者行不通,但是现在可以了)
使用:可以直接from sklearn.metrics import xxx,然后直接输出xxx(y_true, y_pred),或者from sklearn import metrics,然后print时使用metrics.xxx(y_true, y_pred)
【代码1-混淆矩阵指标计算】
from sklearn.metrics import confusion_matrix
#---计算混淆矩阵
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 0]
print('混淆矩阵:\n',confusion_matrix(y_true, y_pred))
【运行结果】
【代码2-准确率指标计算】
#---计算准确率
from sklearn.metrics import accuracy_score
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 0]
print('ACC:',accuracy_score(y_true, y_pred))
【运行结果】
【代码3-精确率、召回率、F1指标计算】
#---计算精确率、召回率、F1
from sklearn import metrics
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 0]
print('Precision',metrics.precision_score(y_true, y_pred))
print('Recall',metrics.recall_score(y_true, y_pred))
print('F1-score:',metrics.f1_score(y_true, y_pred))
【运行结果】
【代码4-计算P-R曲线指标+绘图】
【安装并导入包-matplotlib】
【遇到问题1-import matplotlib.pyplot as plt报错AttributeError: module 'sip' has no attribute 'setapi'】
解决:降级,此包版本有问题
参考:https://www.cnblogs.com/vilogy/p/13507706.html
【包降级成功】
【遇到问题2-plt没有画图】
解决:最后添加一行:plt.show()
Plot使用参考:https://blog.csdn.net/zhbaodong/article/details/81749160
#---计算P-R指标并绘图
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 1, 1]
y_true = [0, 1, 1, 0, 1, 0, 1, 1, 0, 1]
precision, recall, thresholds = precision_recall_curve(y_true, y_pred)
#plt.title('PR Curve')#给图加标题,默认在二维坐标图正上方
#plt.ylabel('Recall')#设置纵坐标名称
#plt.xlabel('Precisionl')#横坐标名称
plt.plot(precision, recall)#绘图-画的是recall和precision之间的关系图,其中默认横坐标是precision、纵坐标是recall;默认图颜色是蓝色;默认绘图直线
plt.show()#加上图才会显示
【运行结果】
【代码5-计算ROC指标+绘图】
#--- ROC曲线
from sklearn.metrics import roc_curve
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 1, 1]
y_true = [0, 1, 1, 0, 1, 0, 1, 1, 0, 1]
FPR,TPR,thresholds=roc_curve(y_true, y_pred)
plt.title('ROC')#加标题
plt.plot(FPR, TPR,'b')#画FPR和TPR之间的关系图,并指定蓝色
plt.plot([0,1],[0,1],'r--')#画直线(指定了横纵坐标轴范围),并指定红色
plt.ylabel('TPR')#设置纵坐标名称
plt.xlabel('FPR')#横坐标
plt.show()#加上图才会显示
【代码6-AUC指标计算】
【安装包-numpy】
在安装pandas时已经默认安装了,因此此步可省
#---计算AUC指标
import numpy as np
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print('AUC socre:',roc_auc_score(y_true, y_scores))
【代码7-KS指标计算】
#--- 计算KS指标值 在实际操作时往往使用ROC曲线配合求出KS值
from sklearn.metrics import roc_curve
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 1, 1]
y_true = [0, 1, 1, 0, 1, 0, 1, 1, 1, 1]
FPR,TPR,thresholds=roc_curve(y_true, y_pred)
KS=abs(FPR-TPR).max()# 计算 KS 曲线
print('KS值:',KS)