KNN算法
代码实现:
1 # !/usr/bin/python3
2 # -*- coding: utf-8 -*-
3
4 import pandas as pd
5 import numpy as np
6 from sklearn.datasets import make_classification
7 from sklearn.neighbors import KNeighborsClassifier
8 from sklearn.model_selection import train_test_split
9 from sklearn.metrics import confusion_matrix,classification_report # 混淆矩阵
10 from sklearn.metrics import precision_recall_curve,roc_auc_score,roc_curve,auc # ROC曲线等
11 import matplotlib.pyplot as plt
12
13 '''
14 1. 准备数据,划分训练集和测试集
15 '''
16
17 # 生成一个5000样本量,30个特征,3个分类的数据集
18 X,y = make_classification(n_samples=5000,n_features=30,n_classes=2,n_informative=2,random_state=10)
19
20 '''
21 make_classification 参数:
22 n_samples:生成的样本数量,默认为100。
23 n_features:特征数量,默认为20。
24 n_informative:信息性特征数量,默认为2。这些特征与输出类别有关。
25 n_redundant:冗余特征数量,默认为2。这些特征是信息性特征的线性组合。
26 n_repeated:重复特征数量,默认为0。这些特征是从其他特征中复制的。
27 n_classes:类别数量,默认为2。
28 n_clusters_per_class:每个类别中的簇数量,默认为2。
29 weights:每个类别的样本权重,默认为None。
30 flip_y:标签翻转概率,默认为0.01,用于增加噪声。
31 class_sep:类间分离因子,默认为1.0。值越大,类分离越明显。
32 hypercube:布尔值,指定特征是否在超立方体中生成,默认为True。
33 shift和scale:用于特征的偏移和平移。
34 shuffle:布尔值,指定生成数据后是否打乱数据,默认为True。
35 random_state:随机数生成器的状态或种子,用于确保数据可重复。
36 返回值包括两个数组:X(形状为的特征矩阵)和y(形状为的目标向量
37
38 '''
39
40 # 将数据集划分为训练集和测试集
41
42 Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.3,random_state=1)
43
44
45 '''
46 2. 建立模型&评估模型
47 '''
48 k_values =
49
50 for k in k_values:
51 clf = KNeighborsClassifier(n_neighbors=k) # 实例化模型
52 clf = clf.fit(Xtrain,Ytrain,) # 使用训练集训练模型
53 score = clf.score(Xtest,Ytest) # 看模型在新数据集(测试集)上的预测效果
54 print(score) # 准确率
55 # 看测试集上的获得的预测概率
56
57 y_prob_1 = clf.predict_proba(Xtest)[:,1]
58 # print(y_prob_1)
59
60 '''
61 predict_proba返回的是一个n行k列的数组,其中每一行代表一个测试样本,每一列代表一个类别。
62 例如,对于二分类问题,返回的数组有两列,第一列表示属于第一个类别的概率,第二列表示属于第二个类别的概率。
63 '''
64 # print(y_prob_0)
65 # print(y_prob_1)
66 # print(y_prob_2)
67 # print(y_prob)
68
69
70 '''
71 3. 绘制ROC曲线,PR曲线
72 '''
73
74
75 # 假正率(FPR)、真正率(TPR)和阈值(thresholds)
76 '''
77 假正率(FPR):假正率表示在实际为负例的样本中,被模型错误预测为正例的比例。
78 真正率(TPR):真正率也称为灵敏度(Sensitivity)或召回率(Recall),它表示在实际为正例的样本中,被模型正确预测为正例的比例。
79 '''
80
81 FPR, TPR, thresholds = roc_curve(Ytest,y_prob_1)
82
83 '''
84 ROC曲线:ROC曲线主要用于衡量二分类器的性能。它以假正率(FPR)为横坐标,真正率(TPR)为纵坐标,绘制出分类器的性能曲线。
85 ROC曲线越靠近左上角,表示分类器的性能越好
86 ROC曲线越靠近左上角(0, 1)点,说明分类器的性能越好。
87
88 AUC(Area Under the Curve)是ROC 曲线下方的面积,范围在0到1之间,可以理解为模型正确区分正例和反例的能力。
89 一个完美的分类器的AUC值为1,而一个随机猜测的分类器的AUC值为0.5。
90
91 '''
92
93 # 计算ROC曲线的参数
94
95 ROC_AUC = auc(FPR, TPR)
96
97 # 绘制ROC曲线
98 plt.subplot(1, 2, 2)
99 plt.plot(FPR, TPR, lw=2, label=f'k={k}, AUC = {ROC_AUC:.2f}')
100 plt.plot(, , color='navy', lw=2, linestyle='--')
101 plt.legend(loc="lower right")
102
103 plt.grid(True)
104 plt.title('ROC')
105 plt.xlabel('FPR')
106 plt.ylabel('TPR')
107 # plt.show()
108
109 '''
110 PR 曲线,全称为 Precision - Recall 曲线,是用于评估分类模型性能的重要工具
111 定义与原理:PR 曲线通过绘制精度(Precision)与召回率(Recall)之间的关系曲线,来展示模型在不同阈值下的表现。
112 精度表示在所有被预测为正类的样本中实际为正类的比例,召回率表示在所有实际为正类的样本中被正确预测为正类的比例。
113 通过改变分类阈值,可以得到一系列不同的精度和召回率值,将这些值绘制成曲线,就得到了 PR 曲线。
114
115 绘制方法:首先计算模型在不同阈值下的精度和召回率。然后,以召回率为横坐标,精度为纵坐标,将各个阈值下对应的点连接起来,形成 PR 曲线。
116 PR曲线越靠近右上角(1, 1)点,说明分类器的性能越好。
117 '''
118
119
120 # 绘制PR曲线
121 # 绘制不同K值的kNN分类器在测试集上的PR曲线,并计算对应的AUC值。
122 # precision_recall_curve 返回结果依次是precision(精确度)、recall(召回率)和 thresholds(阈值)
123 precision, recall, thresholds = precision_recall_curve(Ytest,y_prob_1)
124 pr_auc = auc(recall, precision)
125
126 # 绘制PR曲线
127 plt.subplot(1, 2, 1)
128 plt.plot(recall, precision, lw=2, label=f'k={k}, AUC = {pr_auc:.2f}')
129 plt.legend(loc="lower left")
130 plt.grid(True)
131 plt.title('PR')
132 plt.xlabel('recall')
133 plt.ylabel('precision')
134
135 plt.subplots_adjust(hspace=0.3, wspace=0.3)# 调整间距
136 plt.show()
137
138
139 '''
140 4. 确定K值,确定最终模型
141 '''
142 clf = KNeighborsClassifier(n_neighbors=7)# 实例化模型
143 clf = clf.fit(Xtrain, Ytrain, )# 使用训练集训练模型
144 score = clf.score(Xtest, Ytest)# 看模型在新数据集(测试集)上的预测效果
145 print(score)# 准确率
146
147 print("训练集上的预测准确率为:", clf.score(Xtrain, Ytrain))
148 print("测试集上的预测准确率为:", clf.score(Xtest, Ytest))
149
150 print('混淆矩阵:',confusion_matrix(Ytest, clf.predict(Xtest)))
151 '''
152 混淆矩阵是机器学习中用于评估分类模型性能的重要工具。它通过表格形式直观展示模型预测结果与真实标签的对比,帮助分析分类错误的具体类型。
153 以下是一个二分类混淆矩阵的表格:
154
155 实际为正例 实际为反例
156 预测为正例 真正例(TP) 假正例(FP)
157 预测为反例 真反例(TN) 真反例(FN)
158 真正例(True Positive,TP):正确预测为正类的样本数。
159 假正例(False Positive,FP):实际为负类但被错误预测为正类的样本数。
160 假反例(False Negative,FN):实际为正类但被错误预测为负类的样本数。
161 真反例(True Negative,TN):正确预测为负类的样本数。
162 通过混淆矩阵,我们可以求得准确率、精确率、召回率等性能指标
163
164 '''
165 print('AUC值:',roc_auc_score(Ytest, clf.predict(Xtest)))
166
167 print('整体情况:',classification_report(Ytest, clf.predict(Xtest)))
<br>结果展示:
<br><br>
<br><br><br><br>
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]