当前位置: 代码迷 >> 综合 >> sklearn.neighbors实现KNN分类案例(海伦约会数据集)
  详细解决方案

sklearn.neighbors实现KNN分类案例(海伦约会数据集)

热度:75   发布时间:2023-09-23 12:20:26.0

文章目录

  • sklearn.neighbors实现KNN分类案例
    • 1、导包
    • 2、准备数据
    • 3、查看数据
    • 3、KNeighborsClassifier使用

sklearn.neighbors实现KNN分类案例


  • 案例说明
海伦一直使用在线约会网站寻找适合自己的约会对象特征值:1. 每年飞行常客里程2. 玩游戏视频所占时间比3. 每周消费冰淇淋公升数对应结果分类:didntLike:不喜欢的人smallDoses:魅力一般的人largeDoses:极具魅力得人

1、导包


import  pandas as pd
import  numpy as np
from sklearn.model_selection import train_test_split
from sklearn import neighbors
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator

2、准备数据


dataSet = pd.read_table(r'F:\python_study\data\datingTestSet.txt', header=None)

3、查看数据

# 查看数据列表形状
dataSet.shape()

sklearn.neighbors实现KNN分类案例(海伦约会数据集)

# 查看字段信息
dataSet.info()

sklearn.neighbors实现KNN分类案例(海伦约会数据集)

dataSet.head()

sklearn.neighbors实现KNN分类案例(海伦约会数据集)


3、KNeighborsClassifier使用


  • 数据拆分
# 定义函数
def dataSplit(dataSet, label, test_size=0.1):"""函数功能:数据拆分为 训练集 和测试集@param dataSet: 数据集@param label: 标签@return: X_train , Y_train, X_test, Y_test"""X_train, X_test, Y_train, Y_test = train_test_split(dataSet, label, test_size=test_size, random_state=0)return  X_train, X_test, Y_train, Y_testX_train, X_test, Y_train, Y_test = dataSplit(dataSet=dataSet.iloc[:, :3], label=dataSet.iloc[:,3])
  • 定义 K 值
# 定义一个循环次数k值 查看评分,确定合适K值
k = 20
  • 调包
score_list = []
for i in range(1, k):# 实例化 KNNctf = neighbors.KNeighborsClassifier(n_neighbors=i, algorithm='kd_tree')# 导入训练集合ctf.fit(X_train, Y_train)score_list.append(ctf.score(X_test, Y_test))
  • 画图查看k值对 score 的影响
fig = plt.figure(figsize=(12,6))
plt.rcParams['font.sans-serif'] = ['Simhei']
plt.subplot(121)
plt.plot(x, score_list,c='g')
plt.xlabel("k_num")
plt.ylabel("score_num")
plt.title("k值命中率")
x_major_locator = MultipleLocator(1)
# 把x轴的刻度间隔设置为1,并存在变量里
ax = plt.gca()
ax.xaxis.set_major_locator(x_major_locator)plt.show()

sklearn.neighbors实现KNN分类案例(海伦约会数据集)

  • 数据归一化
    平衡 每年飞行常客里程对结果的影响
def normalDate(dataSet):"""函数功能:数据归一化@param dataSet: 原始数据集@return: 0-1标准化之后的数据集 极差"""minDf = dataSet.min()maxDf = dataSet.max()normSet = (dataSet - minDf) / (maxDf - minDf)return normSet""" 里程数据值相相对其他两项差异较大,对欧几里得求值时影响大;数据归一化 只选取特征数据 """
normalSet = normalDate(dataSet.iloc[:, :3])
normalSet = pd.concat([normalSet,dataSet.iloc[:,3]], axis=1)
# 数据拆分
X_train, X_test, Y_train, Y_test = dataSplit(dataSet=normalSet.iloc[:, :3], label=normalSet.iloc[:, 3])
  • 重新计算
score_list1 = []
for i in range(1, k):# 实例化 KNNctf = neighbors.KNeighborsClassifier(n_neighbors=i, algorithm='kd_tree')# 导入训练集合ctf.fit(X_train, Y_train)score_list1.append(ctf.score(X_test, Y_test))
  • 画图
plt.subplot(122)
plt.plot(x, score_list1,c='g')
plt.xlabel("k_num")
plt.ylabel("score_num")
plt.title("数据归一化k值命中率")
# 把x轴的刻度间隔设置为1,并存在变量里
ax = plt.gca()
ax.xaxis.set_major_locator(x_major_locator)
plt.show()

sklearn.neighbors实现KNN分类案例(海伦约会数据集)

可以看到如果特征之间相差较大,对于预测结果影响还是较大的。数据归一化可提高预测结果的准确性