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

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()

在这里插入图片描述

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

在这里插入图片描述

dataSet.head()

在这里插入图片描述


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_test


X_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):

    # 实例化 KNN
    ctf = 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()

在这里插入图片描述

  • 数据归一化
    平衡 每年飞行常客里程对结果的影响
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):
    # 实例化 KNN
    ctf = 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()

在这里插入图片描述

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

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一年又半

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

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

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

打赏作者

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

抵扣说明:

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

余额充值