Python机器学习基础教程学习笔记(3)——KNN处理forge数据集(分类)

Python机器学习基础教程学习笔记(3)——KNN处理forge数据集(分类)

1 常规引入

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import mglearn
# 不想看到warnings
import warnings
warnings.filterwarnings("ignore", category=Warning)
from collections import Counter

2 forge数据集

  • 一个模拟的二分类数据集
# 生成数据集
X,y = mglearn.datasets.make_forge()
print("X.shape:{}".format(X.shape)) # 26个数据点,2个特征
print("y.shape:{}".format(y.shape)) # 26个目录值
print("classes of y:\n{}".format(Counter(y)))# 两个类别0和1,各13个数据点
X.shape:(26, 2)
y.shape:(26,)
classes of y:
Counter({1: 13, 0: 13})
# 数据集绘图
mglearn.discrete_scatter(X[:,0],X[:,1],y)
plt.legend(["Class 0","Class 1"],loc=4)
plt.xlabel("first feature")
plt.ylabel("second feature")
plt.show()
output_7_0

3 knn分类

  • 适用于二分类和多分类
# knn只考虑1个最近邻的示例,五角星是新增的3个数据点,找到他们最近的1个点的类,就是预测的类
mglearn.plots.plot_knn_classification(n_neighbors=1)
output_9_0
# knn考虑3个最近邻的示例,五角星是新增的3个数据点,找到他们最近的3个点的类,用“投票法”找到3个点的类出现次数更多的类别,就是预测的类
mglearn.plots.plot_knn_classification(n_neighbors=3)
output_10_0

4 用knn算法处理forge数据集

# 拆分训练集与测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=0)
# 引入knn分类器,设置k为3(n_neighbors=3)
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=3)
# 进行训练,对于knn来说,就是保存训练集数据,以便在测试时计算与邻居之间的距离
clf.fit(X_train,y_train)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=3, p=2,
           weights='uniform')
# 调用predict方法来进行预测
print("Test set predictions:{}".format(clf.predict(X_test)))
Test set predictions:[1 0 1 0 1 0 0]
# 评估模型的泛化能力的好坏,调用score方法
print("Test set accuracy:{:.2f}".format(clf.score(X_test,y_test)))
Test set accuracy:0.86

5 分析knn分类器

查看决策边界(decision bundary)

# 查看1个、3个、9个邻居三种情况的决策边界可视化
# plt.subplots()是一个函数,返回一个包含figure和axes对象的元组。
# 因此,使用fig,ax = plt.subplots()将元组分解为fig和ax两个变量。
fig,axes = plt.subplots(
    1,                   # nrows=1,行数
    3,                   # ncols=3,列数
    figsize=(10,3)       # 设置图像大小
)
for n_neighbors,ax in zip([1,3,9],axes):
    clf = KNeighborsClassifier(n_neighbors=n_neighbors).fit(X,y)
    mglearn.plots.plot_2d_separator(clf,X,fill=True,eps=0.5,ax=ax,alpha=.4)
    mglearn.discrete_scatter(X[:,0],X[:,1],y,ax=ax)
    ax.set_title("{} neighbor(s)".format(n_neighbors))
    ax.set_xlabel('feature 0')
    ax.set_ylabel('feature 1')
    ax.legend(loc=3)
output_18_0

从图中看出:

  • k=1,决策边界紧跟着训练数据
  • k越大,决策边界越平滑,对应的模型越简单(模型复杂度越低),泛化能力越强
  • 极端情况,k=训练集中数据点的个数,每个测试点的邻居都完全相同,所有训练结果也完全相同

你可能感兴趣的:(Python机器学习基础教程学习笔记(3)——KNN处理forge数据集(分类))