机器学习入门——KNN

KNN算法

KNN算法原理

  • KNN算法是传统的分类算法。原理是如果一个样本在特征空间中k个最相似的样本大部分属于某一类别,那么这个样本也属于这个类别。
  • 缺陷:参数k不好确定,如果k过小则容易受到异常值影响;如果k过大会受到样本不均衡的影响。 可用网格搜索的方式穷举所有超参数组合找到最佳模型

实现

  • KNN算法可有sklearn的neighbors模块实现
  • 估计器类:https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsTransformer.html#sklearn.neighbors.KNeighborsTransformer

示例

以sklearn提供的玩具数据集:https://scikit-learn.org/stable/datasets/toy_dataset.html#iris-plants-dataset 中的鸢尾花数据集为例使用KNN算法进行分类

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
import warnings
warnings.filterwarnings('ignore')
# 1.获取数据集
data=load_iris()
# 2.划分数据集,20%用于测试,80%用于训练
train_data,test_data,train_target,test_target = train_test_split(data['data'],data['target'],test_size=0.2)
# 查看下iris数据集的信息
# print('iris数据集的信息:\n',data['DESCR'])
# Number of Instances: 150 (50 in each of three classes) 共150个样本,三类各50个
# Number of Attributes: 4 numeric, predictive attributes and the class  数据集是四个特征值一个目标值
# 目标值有三个取值:- Iris-Setosa - Iris-Versicolour - Iris-Virginica
# 首先要做无量纲化,但是没必要做降维,因为特征就4个嘛。
# 3.特征工程,注意要  对   训练集和测试机做相同的标准化处理
convector=StandardScaler()
train_data=convector.fit_transform(train_data)
test_data=convector.transform(test_data)
# 4.模型训练
estimator=KNeighborsClassifier(n_neighbors=3)
# 网格搜索训练处最佳超参数k的模型
best_estimator=GridSearchCV(estimator,param_grid={'n_neighbors':[1,3,5,7]},cv=10)
best_estimator.fit(train_data,train_target)
# 5.模型评估
predict=best_estimator.predict(test_data)
score=best_estimator.score(test_data,test_target)
print('网格搜索交叉验证过程最佳准确率:',best_estimator.best_score_)
print('最佳参数模型:',best_estimator.best_estimator_)
print('网格搜索交叉验证过程各个参数组合模型准确率:\n',best_estimator.cv_results_)
print('模型准确率:',score)
print('测试集预测情况:\n',predict==test_target)   
# 网格搜索交叉验证过程最佳准确率: 0.9583333333333333
# 最佳参数模型: KNeighborsClassifier(n_neighbors=3)
# 网格搜索交叉验证过程各个参数组合模型准确率:
#  {'mean_fit_time': array([0.0004514 , 0.00040567, 0.00025358, 0.00010374]), 'std_fit_time': array([0.00047228, 0.0006315 , 0.00060607, 0.00031121]), 'mean_score_time': array([0.00100272, 0.00122864, 0.00123372, 0.00049276]), 'std_score_time': array([0.00045056, 0.00167203, 0.00272466, 0.00067034]), 'param_n_neighbors': masked_array(data=[1, 3, 5, 7],
#              mask=[False, False, False, False],
#        fill_value='?',
#             dtype=object), 'params': [{'n_neighbors': 1}, {'n_neighbors': 3}, {'n_neighbors': 5}, {'n_neighbors': 7}], 'split0_test_score': array([1., 1., 1., 1.]), 'split1_test_score': array([0.83333333, 0.91666667, 0.91666667, 0.91666667]), 'split2_test_score': array([0.91666667, 0.91666667, 0.91666667, 0.91666667]), 'split3_test_score': array([1., 1., 1., 1.]), 'split4_test_score': array([0.91666667, 0.91666667, 0.91666667, 0.91666667]), 'split5_test_score': array([0.91666667, 0.91666667, 0.91666667, 1.        ]), 'split6_test_score': array([1., 1., 1., 1.]), 'split7_test_score': array([1.        , 1.        , 0.91666667, 0.91666667]), 'split8_test_score': array([0.91666667, 1.        , 1.        , 0.91666667]), 'split9_test_score': array([0.91666667, 0.91666667, 0.91666667, 0.91666667]), 'mean_test_score': array([0.94166667, 0.95833333, 0.95      , 0.95      ]), 'std_test_score': array([0.05335937, 0.04166667, 0.04082483, 0.04082483]), 'rank_test_score': array([4, 1, 2, 2])}
# 模型准确率: 1.0
# 测试集预测情况:
#  [ True  True  True  True  True  True  True  True  True  True  True  True
#   True  True  True  True  True  True  True  True  True  True  True  True
#   True  True  True  True  True  True]

你可能感兴趣的:(机器学习,sklearn,python)