#机器学习实现模型评估第二课
#用逻辑回归模型
#pima indian diabetes
#混淆矩阵,和模型的衡量以及其意义
#任务:通过怀孕次数,胰岛素水平,体重指标和年龄四个特征预测是否患有糖尿病
先读取文件with open as 老套路
#数据预处理
import pandas as pd
import numpy as np
import csv
#以下这个阅读路径的方式需要学习记住!!!
path =r'C:\Users\hhk\anaconda3\data\diabetes.csv'
with open(path,'rb') as csvfile:
pima = pd.read_csv(path) #pima=csv.readline(path)
pima.head(4) #查看前面几个
这里可以看下文件头几行是否正确显示。
我们去除Outcome这一列数据。
#这一段插入一下,用朴素叶贝斯去训练数据试一试
Xp = pima.drop(['Outcome'],axis = 1) #拿掉outcome这一列
yp = pima.loc[: , ["Outcome"]]
#x,y的赋值
feature_names = ['Pregnancies','Insulin','BMI','Age']
X = pima[feature_names] #赋值,取多列数据,直接中括号放进去就可以
y = pima.Outcome
然后用朴素贝叶斯去训练,大致方法差不多,先调用算法,然后填入数据
from sklearn.naive_bayes import CategoricalNB
model = CategoricalNB() #建模
model.fit(Xp,yp) #开始训练数据
yp_predict_proba = model.predict_proba(Xp)
yp_predict = model.predict(Xp)
print(yp_predict_proba)
#依旧是计算准确度
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(yp,yp_predict) #准确度在*¥%的样子,感觉还不错
print(accuracy)
这里output是 0.8450520833333334
#数据分离
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state= 0)
#random_state = 0 每一次都是一样的分离方式,可以复现
#测试数据集结果预测
y_pred = logreg.predict(X_test)
#使用准确率进行评估
from sklearn import metrics
print(metrics.accuracy_score(y_test,y_pred))
这里output是 0.6770833333333334
后面用到了混淆矩阵,大致是这样的。
#确认正负样本数据量
y_test.value_counts()
0 130 1 62 Name: Outcome, dtype: int64
#空准确率
max(y_test.mean(),1 - y_test.mean())
#计算展示混淆矩阵
print(metrics.confusion_matrix(y_test,y_pred))
[[114 16] [ 46 16]]
将四个因素,分别是正向正确率,正向错误率,负向正确率,负向错误率进行区分。
#四个因子赋值
confusion = metrics.confusion_matrix(y_test,y_pred)
TN = confusion[0,0]
FP = confusion[0,1]
FN = confusion[1,0]
TP = confusion[1,1]
print(TN,FP,FN,TP)
accuracy = (TP + TN)/ (TP + TN + FP + FN)
print(accuracy)
print(metrics.accuracy_score(y_test,y_pred))
0.6770833333333334 0.6770833333333334
#错误率
mis_rate = (FP + FN)/ (TP + TN + FP + FN)
print(mis_rate)
print(1 - metrics.accuracy_score(y_test,y_pred))
0.3229166666666667 0.32291666666666663
#灵敏度
recall = TP/(TP+FN)
print(recall)
0.25806451612903225
#特征值的计算
specificity = TN/(TN + FP)
print(specificity)
#精确度的计算
precision = TP /(TP + FP)
print(precision)
0.8769230769230769 0.5
f1_score = 2*precision*recall/(precision + recall)
print(f1_score)
0.3404255319148936