文章目录
- 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()
# 查看字段信息
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_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()
- 数据归一化
平衡 每年飞行常客里程对结果的影响
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()
可以看到如果特征之间相差较大,对于预测结果影响还是较大的。数据归一化可提高预测结果的准确性