Python遇见机器学习 ---- k近邻(kNN)算法(三)

简介: 所谓:“近朱者赤,近墨者黑”

05 超参数


超参数:在算法运行前需要确定的参数,即kNN中的k

模型参数:算法过程中学习到的参数

通过以上对kNN方法的讨论可知,kNN算法没有模型参数

import numpy as np
from sklearn import datasets
digits = datasets.load_digits()
X = digits.data
y = digits.target
from sklearn.model_selection import train_test_split
​X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
from sklearn.neighbors import KNeighborsClassifier
​knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train, y_train)
knn_clf.score(X_test, y_test)
# Out[4]:
# 0.98611111111111116

寻找最好的k

best_score = 0.0
best_k = -1
for k in range(1, 11): # 搜索1到10中最好的k,分别创建k等于不同值时的分类器,用score方法评判
    knn_clf = KNeighborsClassifier(n_neighbors=k)
    knn_clf.fit(X_train, y_train)
    score = knn_clf.score(X_test, y_test)
    if score > best_score:
        best_k = k
        best_score = score
print("best_k=",best_k)
print("best_score=",best_score)
# best_k= 7 
# best_score= 0.988888888889

考虑距离?不考虑距离?


kNN算法如果考虑距离,则分类过程中待测数据点与临近点的关系成反比,距离越大,得票的权重越小

best_method = ""
best_score = 0.0
best_k = -1
​for method in ["uniform", "distance"]:
    for k in range(1, 11): # 搜索1到10中最好的k
        knn_clf = KNeighborsClassifier(n_neighbors=k, weights=method)
        knn_clf.fit(X_train, y_train)
        score = knn_clf.score(X_test, y_test)
        if score > best_score:
            best_k = k
            best_score = score
            best_method = method
print("best_method=",best_method)
print("best_k=",best_k)
print("best_score=",best_score)
# best_method= uniform 
# best_k= 1 
# best_score= 0.994444444444



搜索明可夫斯基距离相应的p

%%time
best_p = -1
best_score = 0.0
best_k = -1​
for k in range(1, 11): # 搜索1到10中最好的k
    for p in range(1, 6): # 距离参数
        knn_clf = KNeighborsClassifier(n_neighbors=k, weights="distance", p = p)
        knn_clf.fit(X_train, y_train)
        score = knn_clf.score(X_test, y_test)
        if score > best_score:
            best_k = k
            best_score = score
            best_p = p
print("best_p=", best_p)
print("best_k=", best_k)
print("best_score=", best_score)
# best_p= 2 
# best_k= 1 
# best_score= 0.994444444444 
# CPU times: user 15.3 s, sys: 51.5 ms, total: 15.4 s Wall time: 15.5 s

以上多重循环的过程可以抽象成一张网格,将网格上面的所有点都遍历一遍求最好的值

 

06 网格搜索


补充:kNN中的“距离”

明可夫斯基距离:此时获得了一个超参数p,当p = 1时为曼哈顿距离,当p = 2时为欧拉距离

 8.png


数据准备:

import numpy as np
from sklearn import datasets
digits = datasets.load_digits()
X = digits.data
y = digits.target
from sklearn.model_selection import train_test_split
​X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)
from sklearn.neighbors import KNeighborsClassifier
​knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train, y_train)
knn_clf.score(X_test, y_test)
# Out[4]:
# 0.98888888888888893

Grid Search


可以将上一节中的网格搜索思想用以下方法更简便的表达出来

# 定义网格参数,每个字典写上要遍历的参数的取值集合
param_grid = [
{
'weights':['uniform'],
'n_neighbors':[i for i in range(1, 11)]
},
{
'weights':['distance'],
'n_neighbors':[i for i in range(1, 11)],
'p':[i for i in range(1, 6)]
}
]
knn_clf = KNeighborsClassifier()
# 导入网格搜索方法(此方法使用交叉验证CV)
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(knn_clf, param_grid)
%%time
grid_search.fit(X_train, y_train)
# CPU times: user 2min 2s, sys: 320 ms, total: 2min 2s Wall time: 2min 3s
"""
GridSearchCV(cv=None, error_score='raise', estimator=KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', 
metric_params=None, n_jobs=1, n_neighbors=5, p=2, weights='uniform'), 
fit_params=None, iid=True, n_jobs=1, param_grid=[{'weights': ['uniform'], 
'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}, {'weights': ['distance'], 
'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'p': [1, 2, 3, 4, 5]}], 
pre_dispatch='2*n_jobs', refit=True, return_train_score='warn', scoring=None, 
verbose=0)
"""
grid_search.best_estimator_ # 返回最好的分类器,(变量名最后带一个下划线是因为这是根据用户输入所计算出来的)
"""
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', 
metric_params=None, n_jobs=1, n_neighbors=3, p=3, weights='distance')
"""
grid_search.best_score_ # 最好方法的准确率
# Out[11]:
# 0.98538622129436326
grid_search.best_params_ # 最优方法的对应参数
# Out[12]:
# {'n_neighbors': 3, 'p': 3, 'weights': 'distance'}
knn_clf = grid_search.best_estimator_
knn_clf.score(X_test, y_test)
# Out[14]:
# 0.98333333333333328
%%time
grid_search = GridSearchCV(knn_clf, param_grid, n_jobs=-1, verbose=2) # n_jobs采用多少核,verbose:执行时输出,整数越大,信息越详细
grid_search.fit(X_train, y_train)


Fitting 3 folds for each of 60 candidates, totalling 180 fits

[CV] n_neighbors=1, weights=uniform ..................................

[CV] n_neighbors=1, weights=uniform ..................................

[CV] n_neighbors=1, weights=uniform ..................................

[CV] n_neighbors=2, weights=uniform ..................................

[CV] ................... n_neighbors=1, weights=uniform, total= 0.7s


[CV] n_neighbors=3, weights=uniform ..................................

[CV] ................... n_neighbors=2, weights=uniform, total= 1.0s ......


CPU times: user 651 ms, sys: 343 ms, total: 994 ms Wall time: 1min 23s

[Parallel(n_jobs=-1)]: Done 180 out of 180 | elapsed: 1.4min finished


相关文章
|
机器学习/深度学习 算法 Python
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
620 7
|
10月前
|
机器学习/深度学习 数据采集 人工智能
【机器学习算法篇】K-近邻算法
K近邻(KNN)是一种基于“物以类聚”思想的监督学习算法,通过计算样本间距离,选取最近K个邻居投票决定类别。支持多种距离度量,如欧式、曼哈顿、余弦相似度等,适用于分类与回归任务。结合Scikit-learn可高效实现,需合理选择K值并进行数据预处理,常用于鸢尾花分类等经典案例。(238字)
|
机器学习/深度学习 人工智能 算法
Scikit-learn:Python机器学习的瑞士军刀
想要快速入门机器学习但被复杂算法吓退?本文详解Scikit-learn如何让您无需深厚数学背景也能构建强大AI模型。从数据预处理到模型评估,从垃圾邮件过滤到信用风险评估,通过实用案例和直观图表,带您掌握这把Python机器学习的'瑞士军刀'。无论您是AI新手还是经验丰富的数据科学家,都能从中获取将理论转化为实际应用的关键技巧。了解Scikit-learn与大语言模型的最新集成方式,抢先掌握机器学习的未来发展方向!
1465 12
Scikit-learn:Python机器学习的瑞士军刀
|
机器学习/深度学习 数据采集 人工智能
20分钟掌握机器学习算法指南
在短短20分钟内,从零开始理解主流机器学习算法的工作原理,掌握算法选择策略,并建立对神经网络的直观认识。本文用通俗易懂的语言和生动的比喻,帮助你告别算法选择的困惑,轻松踏入AI的大门。
1027 8
|
机器学习/深度学习 存储 Kubernetes
【重磅发布】AllData数据中台核心功能:机器学习算法平台
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
机器学习/深度学习 人工智能 自然语言处理
AI训练师入行指南(三):机器学习算法和模型架构选择
从淘金到雕琢,将原始数据炼成智能珠宝!本文带您走进数字珠宝工坊,用算法工具打磨数据金砂。从基础的经典算法到精密的深度学习模型,结合电商、医疗、金融等场景实战,手把手教您选择合适工具,打造价值连城的智能应用。掌握AutoML改装套件与模型蒸馏术,让复杂问题迎刃而解。握紧算法刻刀,为数字世界雕刻文明!
560 6
|
机器学习/深度学习 数据可视化 算法
Python 高级编程与实战:深入理解数据科学与机器学习
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化和调试技巧。本文将深入探讨 Python 在数据科学和机器学习中的应用,并通过实战项目帮助你掌握这些技术。
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习】K-Means对文本聚类和半环形数据聚类实战(附源码和数据集)
【Python机器学习】K-Means对文本聚类和半环形数据聚类实战(附源码和数据集)
695 0
|
机器学习/深度学习 算法 数据挖掘
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧1
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
355 5

热门文章

最新文章

推荐镜像

更多