分别利用scikit-learn库函数和自编函数实现K近邻分类器(选用乳腺癌数据)——机器学习

目录

scikit-learn库函数实现

自编函数

scikit-learn库函数实现

代码部分:

import seaborn as sns
from sklearn.model_selection import train_test_split     #导入切分训练集、测试集模块
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix

df = pd.read_csv('breastCancer.csv')# 导入训练集
df.head()  # 查看数据集前五行

X1=df.iloc[:,df.columns!="Class"]  # 选择所有行和列,但排除type的那一列
X=X1.iloc[:,1:]
print(X)
y=df['Class']  # 将Class列作为预测值
# # 划分数据集
X_train, X_valid, y_train, y_valid = train_test_split(X, y,test_size = 0.3,random_state=0)

def model():
    knn = KNeighborsClassifier(8)    #实例化KNN模型
    knn.fit(X_train, y_train)      #放入训练数据进行训练
    print(knn.predict(X_valid))           #打印预测内容
    # print(y_valid)     #实际标签
    print("准确率:",knn.score(X_valid, y_valid))
    return knn

def show():
    prediction=model().predict(X_valid)
    plt.figure(figsize=(10, 7))
    cm = confusion_matrix(y_valid, prediction)

    ax = sns.heatmap(cm, annot=True, fmt="d", cmap='Blues')
    plt.ylabel('Actual label')  # x轴标题
    plt.xlabel('Predicted label')  # y轴标题
    plt.show()

if __name__ == '__main__':
    show()

最后结果: 

在对最后数据进行展现的时候只用了一个混淆矩阵进行显示,个人觉得没有很好进行数据对比和展现,由于比较懒,也就没有进行优化和更改,希望谅解,最后的准确率还是比较高的。

自编函数

代码部分:

import numpy as np
import operator
import pandas as pd

def createDataSet():
    # group - 数据集
    # labels - 分类标签
    df = pd.read_csv('breastCancer.csv')# 导入训练集
    group_01=df.iloc[:,df.columns!="Class"]  # 选择所有行和列,但排除type的那一列
    group=group_01.iloc[:,1:] # 由于第一行是编码数字,与预测分类没有关系,就直接去掉了
    labels=df['Class']  # 将Class列作为预测值
    # # 划分数据集

    return group,labels

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndices = distances.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndices[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]
if __name__ == '__main__':
    group,labels=createDataSet()
    group_01=np.array(group)
    labels=np.array(labels)
    test=np.array(group.iloc[:5,:]).tolist()   #转为列表
    print("测试集",test)
    # kNN分类
    results=[] # 预测的结果
    for  i  in test:
        test_class = classify0(i, group, labels, 3)
    # 打印分类结果
        results.append(test_class)
    print(results)
    # 最终得到最后的预测结果

最后结果:

原本想再创建一个show()函数,来对最后预测数据进行一个可视化处理同时与原始数据进行对比的,但是由于期末月的原因,暂时没有时间来进行修改,就只是打印了一下最后的预测结果,测试集也就只是在原始数据集上截取前面5行来进行测试,最后结果还是不错的。

 最后,代码中还有很多需要修改和优化的地方,希望大家谅解,同时也希望大家提出不足之处,数据的话可以在在评论区说一下我发给你,谢谢大家!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Vous oublie@

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

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

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

打赏作者

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

抵扣说明:

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

余额充值