一、引言
KNN可用于分类和回归,用于分类时是多分类方法。
注意:由于此方法根据预测点近邻的各类点的个数多少来确定该预测点的类别,因此原始类别数据不均衡,将严重影响最终分类效果。
二、KNN分类思想
如上图所示,有两类不同的样本,分别为蓝色正方形和红色三角形,而绿色的圆代表待分类的数据,所以呢我们就要给绿色的圆分类。
- 如果K=3,绿色的圆最近的三个邻居分别是:两个红色的三角形和一个蓝色的正方形那我们就少数服从多数,基于统计的方法,判定绿色的圆属于红色三角形这一类。
- 如果K=5,绿色的圆最近的五个邻居分别是:两个红色的三角形和三个蓝色的正方形那我们就少数服从多数,基于统计的方法,判定绿色的圆属于蓝色正方形这一类。
三、?使用KNN完成乳腺癌检测分类
乳腺癌检测分类数据集说明:
? ?乳腺癌检测数据集:数据集共有569个样本,每个样本有30个特征,其中357个阳性,212个阴性
?数据集已经在资源中上传。
四、Python代码实现
(1)读入数据集
import numpy as np
import pandas as pd
data1=pd.read_csv('./data_picture/chapter3/breast-cancer.csv')
data1.head()
(2)生成训练集和测试集(我们将label提出来,生成X,Y;75%训练集25%测试集;随机种子数是个数就可以)
X=data1.drop('class',axis=1)
y=data1['class']
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=6)
(3)由于方法用到了距离,而且距离值直接影响到聚类效果,因此在聚类前必须对每一个特征数据进行标准化或归一化处理。
from sklearn.preprocessing import StandardScaler
ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.transform(X_test)
(4)构建KNN模型和预测?
from sklearn.neighbors import KNeighborsClassifier
model=KNeighborsClassifier()
model.fit(X_train,y_train)
(5)模型评估
from sklearn.metrics import classification_report
print("训练集的模型评估指标:")
model_score=model.score(X_train,y_train)
print()
print('The accuracy of train data',model_score)
print('--------------------------------------------------------------------------')
y_train_predict=model.predict(X_train)
model_report1=classification_report(y_train,y_train_predict)
print(model_report1)
print('$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$')
print("测试集的模型评估指标:")
model_score=model.score(X_test,y_test)
print()
print('The accuracy of test data is',model_score)
print('--------------------------------------------------------------------------')
y_predict=model.predict(X_test)
model_report=classification_report(y_test,y_predict)
print(model_report)
print('--------------------------------------------------------------------------')
结果:
(6)模型保存(方便后面使用)?
from sklearn.externals import joblib
joblib.dump(model,'model_knn.pkl')
(7)模型导入(利用调入的模型对数据进行预测时,要保证待预测数据和模型训练时的数据格式一致,如果训练时数据做了标准化,?则待预测数据必须做相应的标准化。)
?
model=joblib.load('model_knn.pkl') #调入模型
y_pred=model.predict(X_test)
model.score(X_test,y_test)
结果:
?
|