第一个模型:k近邻算法

=======================================================================                Machine Learning notebook
Python机器学习基础教程(introduction to Machine Learning with Python)
https://github.com/amueller/introduction_to_ml_with_python/blob/master/01-introduction.ipynb

=======================================================================

监督机器学习问题主要分为两类:分类、回归

  k近邻算法中k的含义是,我们可以考虑训练集中与新数据点最近的任意k个邻居,而不是只考虑最近的那一个。
  scikit-learn中所有的机器学习模型都在各自的类中实现,这些类被称为Estimator类。
一、1.K-nn算法在分类问题中的应用:
  k近邻算法是在neighbors模块儿的KNeighborsClassifier类中实现的。
构建对象后才能使用这一模型。

from sklearn.neighbors import KNeighborsClassifier
knn=KNeighborsClassifier(n_neighbors=1)

knn对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行预测的算法。它还包括算法从训练数据中提取的信息。
  想要基于训练集来构建模型,需要调用knn对象的fit方法,输入参数为X_train和y_train,二者都是NumPy数组,前者包含训练数据,后者包含相应的标签(输出数据):

In [26]:
knn.fit(X_train, y_train)
Out[26]:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=1, p=2,
           weights='uniform')

scikit-learn中的大多数模型都有很多参数,但多用于速度优化或非常特殊的用途。平时使用时无需过多的关注。

可以使用knn对象的score方法来计算测试集的精度:

#需要进行预测的数据
X_new = np.array([[5, 2.9, 1, 0.2]])
print("X_new.shape:", X_new.shape)

#使用新创建的模型来进行预测
prediction = knn.predict(X_new)
print("Prediction:{}".format(prediction))
print("Predicted target name:{}".format
      (iris_dataset['target_names'][prediction]))

y_pred = knn.predict(X_test)
print("Test set predictions:\n", y_pred)
#评估模型,计算模型的精度
print("Test set score: {:.2f}".format(np.mean(y_pred == y_test)))

print("Test set score: {:.2f}".format(knn.score(X_test, y_test)))

2.K-nn算法在回归问题中的应用:
用于回归的k-nn算法在scikit-learn的KNeighborsRegressor类中实现。其用法与KNeighborsClassifier类似:

  用score方法来评估模型,对于回归问题,这一方法返回的是R2分数。R2分数也叫做决定系数,是回归模型预测的优度度量,位于0到1之间。R2等于1对应完美预测,R2等于0对应常数模型,即总是预测训练集响应(y_train)的平均值。

import mglearn
from sklearn.model_selection import train_test_split

#用于回归的k-nn算法在scikit-learn的KNeighborsRegressor
#类中实现。其用法与KNeighborsClassifier类似:
mglearn.plots.plot_knn_regression(n_neighbors=1)
mglearn.plots.plot_knn_regression(n_neighbors=3)

from sklearn.neighbors import KNeighborsRegressor
X, y = mglearn.datasets.make_wave(n_samples=40)

# split the wave dataset into a training and a test set
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

# 模型实例化,并将邻居个数设置为3
reg = KNeighborsRegressor(n_neighbors=3)
# 利用训练数据和训练目标值来拟合模型
reg.fit(X_train, y_train)

#对测试集数据进行预测
print("Test set predictions:\n", reg.predict(X_test))
#计算测试集的精度
print("Test set R^2: {:.2f}".format(reg.score(X_test, y_test)))

二、优点、缺点、参数
  KNeighbors分类器有2个重要参数:邻居个数与数据点之间距离的度量方法。在实践中,使用较小的邻居个数(比如3个或5个)往往可以得到较好的结果,但应当进行更多尝试,通过已邻居个数为变量绘制训练集和测试集精度的对比图,能够有效的找出最佳值。此外,选择合适的距离度量方法也十分关键,通常情况下使用欧式距离即可,它在许多情况下的效果都很好。
例:邻居个数为变量绘制训练集和测试集精度的对比图

from sklearn.neighbors import KNeighborsClassifier
cancer=load_breast_cancer()
#拆分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    cancer.data, cancer.target, stratify=cancer.target, random_state=66)

training_accuracy = []
test_accuracy = []
#n_neighbors 邻居的个数从1到10 之间取值
neighbors_settings = range(1, 11)

for n_neighbors in neighbors_settings:
    # 构建模型
    clf = KNeighborsClassifier(n_neighbors=n_neighbors)
    clf.fit(X_train, y_train)
    # 记录训练集精度
    training_accuracy.append(clf.score(X_train, y_train))
    # 记录泛华精度
    test_accuracy.append(clf.score(X_test, y_test))

plt.plot(neighbors_settings, training_accuracy, label="training accuracy")
plt.plot(neighbors_settings, test_accuracy, label="test accuracy")
plt.ylabel("Accuracy")
plt.xlabel("n_neighbors")
plt.legend()
plt.savefig("picture2-7.png")

在这里插入图片描述

K-NN算法的优点之一就是模型很容易理解,通常不需要过多调节就可以的到不错的性能。在考虑使用更高级的技术之前,尝试此算法是一种很好的基准方法。构建最近邻模型的速度通常很快,但如果训练集很大(特征数很多或者样本数很大,预测速度可能会比较慢)。这一算法对于有很多特征(几百或更多)的数据集往往效果不好,对于大多数特征的大多数取值都为0的数据集(稀疏矩阵)来说,这一算法的效果尤其不好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值