本文介绍: 闵可夫斯基距离是曼哈顿距离和欧氏距离的一般化形式,可以根据p的值调整距离计算方式random_state取值不同,最后算法预测结果也会收到影响比如这里设置为233,最后会更容易得到100%的结果,原因是取值不同会导致训练集和测试划分不同,进而影响训练测试数据组合。它是从一个点到另一个点沿着网格线的距离,即两点横坐标差的绝对值加上纵坐标差的绝对值。: 设置为’distance’,表示使用距离的倒数作为权重。它是从一个点到另一个点直线距离,即两点之间的直线距离的平方根

数据加载

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
x = iris.data
y = iris.target
x.shape, y.shape
((150, 4), (150,))
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=666, stratify=y)

x_train.shape, x_test.shape, y_train.shape, y_test.shape
((105, 4), (45, 4), (105,), (45,))

random_state取值不同,最后算法预测结果也会收到影响比如这里设置为233,最后会更容易得到100%的结果,原因是取值不同会导致训练集和测试划分不同,进而影响训练测试数据组合

手写超参数搜索

from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(
    n_neighbors=3,
    weights='distance',
    p=2
)

n_neighbors: 设置为3,表示在进行分类时考虑最近的3个邻居的标签
weights: 设置为’distance’,表示使用距离的倒数作为权重。这意味着与目标样本距离越近的邻居对分类的贡献越大。如果将其设置为’uniform’,则所有邻居的权重都相等。
p: 设置为2,表示使用欧氏距离作为距离度量。如果p设置为1,则使用曼哈顿距离。

neigh.fit(x_train, y_train)
neigh.score(x_test, y_test)
0.9333333333333333
best_score = -1
best_n = -1
best_weight = ''
best_p = -1

for n in range(1, 20):
    for weight in ['uniform', 'distance']:
        for p in range(1, 7):
            neigh = KNeighborsClassifier(
                n_neighbors=n,
                weights=weight,
                p=p
            )
            neigh.fit(x_train, y_train)
            score = neigh.score(x_test, y_test)
            
            if score > best_score:
                best_score = score
                best_n = n
                best_p = p
                best_weight = weight
            
print("n_neighbors:", best_n)
print("weights:", best_weight)
print("p:", best_p)
print("score:", best_score)
n_neighbors: 8
weights: uniform
p: 2
score: 0.9777777777777777

当p为数值时,常用的取值为1和2:
p = 1:表示使用曼哈顿距离(Manhattan distance),也称为L1距离。它是从一个点到另一个点沿着网格线的距离,即两点横坐标差的绝对值加上纵坐标差的绝对值。
p = 2:表示使用欧氏距离(Euclidean distance),也称为L2距离。它是从一个点到另一个点的直线距离,即两点之间的直线距离的平方根

当p为浮点数时,表示使用闵可夫斯基距离(Minkowski distance)。闵可夫斯基距离是曼哈顿距离和欧氏距离的一般化形式,可以根据p的值调整距离的计算方式。当p趋近于无穷大时,闵可夫斯基距离逐渐变为切比雪夫距离(Chebyshev distance)。

sklearn 超参数搜索

from sklearn.model_selection import GridSearchCV
params = {
    'n_neighbors': [n for n in range(1, 30)],
    'weights': ['uniform', 'distance'],
    'p': [p for p in range(1, 7)]
}
grid = GridSearchCV(
    estimator=KNeighborsClassifier(),
    param_grid=params,
    n_jobs=-1  # 使用所有可用的CPU
)
grid.fit(x_train, y_train)
grid.best_params_, grid.best_score_
({'n_neighbors': 3, 'p': 2, 'weights': 'uniform'}, 0.9904761904761905)
grid.best_estimator_.predict(x_test)
grid.best_estimator_.score(x_test, y_test)
0.9333333333333333

发现结果与之前手写的超参数搜索的不同,这是准确度计算方法不同导致的。

原文地址:https://blog.csdn.net/Uperrr/article/details/134647815

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_12579.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注