"""
近邻分类算法是在 neighbors 模块的 KNeighborsClassifier 类中实现的。
我们需要将这个类实例化为一个对象,然后才能使用这个模型。这时我们需要设置模型的参数。
KNeighborsClassifier 最重要的参数就是邻居的数目,这里我们设为 1
knn 对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行
预测的算法。它还包括算法从训练数据中提取的信息。对于 KNeighborsClassifier 来说,
里面只保存了训练集。
想要基于训练集来构建模型,需要调用 knn 对象的 fit 方法,输入参数为 X_train 和 y_
train,二者都是 NumPy 数组,前者包含训练数据,后者包含相应的训练标签
"""
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import scipy as sp
import IPython
import sklearn
iris_dataset = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
iris_dataset['data'], iris_dataset['target'], random_state=0)
print(f"X_test shape: {X_train.shape}")
print(f"y_test shape: {y_train.shape}")
print(f"X_test shape: {X_test.shape}")
print(f"y_test shape: {y_test.shape}")
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
# fit 方法返回的是 knn 对象本身并做原处修改,因此我们得到了分类器的字符串表示。
X_new = np.array([[5, 2.9, 1, 0.2]])
# 我们将这朵花的测量数据转换为二维 NumPy 数组的一行,这是因为 scikit-learn的输入数据必须是二维数组。
print(f"X_new.shape: {X_new.shape}")
print(X_new)
#我们调用 knn 对象的 predict 方法来进行预测:
prediction = knn.predict(X_new)
print(f"Prediction: {prediction}")
print(f"Prediction target name: {iris_dataset['target_names'][prediction]}")
""" 评估模型
这里需要用到之前创建的测试集。这些数据没有用于构建模型,但我们知道测试集中每朵鸢尾花的实际品种。
因此,我们可以对测试数据中的每朵鸢尾花进行预测,并将预测结果与标签(已知的品种)进行对比。
我们可以通过计算精度(accuracy)来衡量模型的优劣,精度就是品种预测正确的花所占的比例
"""
y_pred = knn.predict(X_test)
print(f"Test set predictions:\n {y_pred}")
print("Test set sore {:.2f}".format(np.mean(y_pred == y_test)))