Python implémente l'algorithme KNN (le plus proche voisin)

Algorithme KNN (plus proche voisin)

L'algorithme KNN est probablement le plus intuitif parmi les algorithmes d'exploration de données standard. Afin de classer les nouveaux individus, il recherche l'ensemble d'apprentissage, trouve les individus les plus similaires aux nouveaux individus, voit à quelle catégorie ces individus appartiennent le plus, puis classe les nouveaux individus dans quelle catégorie l'
algorithme KNN peut classer presque n'importe quel ensemble de données. Cependant, pour calculer la distance entre deux individus dans l'ensemble de données, la quantité de calcul est très grande

Sélection de l'ensemble de données

Cet ensemble de données utilise des données d'ionisation. Chaque ligne de l'ensemble de données comporte 35 valeurs. Les 34 premières sont des données collectées par l'antenne. La dernière valeur est "g" ou "b", indiquant si les données sont bonnes ou mauvaises, c'est-à-dire si elles sont fournies les informations précieuses que
nous devons faire sont d'utiliser l'algorithme KNN pour déterminer automatiquement la qualité des données qui
suit est une vue partielle des données

1,0,0.47337,0.19527,0.06213,-0.18343,0.62316,0.01006,0.45562,-0.04438,0.56509,0.01775,0.44675,0.27515,0.71598,-0.03846,0.55621,0.12426,0.41420,0.11538,0.52767,0.02842,0.51183,-0.10651,0.47929,-0.02367,0.46514,0.03259,0.53550,0.25148,0.31953,-0.14497,0.34615,-0.00296,g
1,0,0.59887,0.14689,0.69868,-0.13936,0.85122,-0.13936,0.80979,0.02448,0.50471,0.02825,0.67420,-0.04520,0.80791,-0.13748,0.51412,-0.24482,0.81544,-0.14313,0.70245,-0.00377,0.33333,0.06215,0.56121,-0.33145,0.61444,-0.16837,0.52731,-0.02072,0.53861,-0.31262,0.67420,-0.22034,g
1,0,0.84713,-0.03397,0.86412,-0.08493,0.81953,0,0.73673,-0.07643,0.71975,-0.13588,0.74947,-0.11677,0.77495,-0.18684,0.78132,-0.21231,0.61996,-0.10191,0.79193,-0.15711,0.89384,-0.03397,0.84926,-0.26115,0.74115,-0.23312,0.66242,-0.22293,0.72611,-0.37792,0.65817,-0.24841,g
1,0,0.87772,-0.08152,0.83424,0.07337,0.84783,0.04076,0.77174,-0.02174,0.77174,-0.05707,0.82337,-0.10598,0.67935,-0.00543,0.88043,-0.20924,0.83424,0.03261,0.86413,-0.05978,0.97283,-0.27989,0.85054,-0.18750,0.83705,-0.10211,0.85870,-0.03261,0.78533,-0.10870,0.79076,-0.00543,g
1,0,0.74704,-0.13241,0.53755,0.16996,0.72727,0.09486,0.69565,-0.11067,0.66798,-0.23518,0.87945,-0.19170,0.73715,0.04150,0.63043,-0.00395,0.63636,-0.11858,0.79249,-0.25296,0.66403,-0.28656,0.67194,-0.10474,0.61847,-0.12041,0.60079,-0.20949,0.37549,0.06917,0.61067,-0.01383,g
1,0,0.46785,0.11308,0.58980,0.00665,0.55432,0.06874,0.47894,-0.13969,0.52993,0.01330,0.63858,-0.16186,0.67849,-0.03326,0.54545,-0.13525,0.52993,-0.04656,0.47894,-0.19512,0.50776,-0.13525,0.41463,-0.20177,0.53930,-0.11455,0.59867,-0.02882,0.53659,-0.11752,0.56319,-0.04435,g
1,0,0.88116,0.27475,0.72125,0.42881,0.61559,0.63662,0.38825,0.90502,0.09831,0.96128,-0.20097,0.89200,-0.35737,0.77500,-0.65114,0.62210,-0.78768,0.45535,-0.81856,0.19095,-0.83943,-0.08079,-0.78334,-0.26356,-0.67557,-0.45511,-0.54732,-0.60858,-0.30512,-0.66700,-0.19312,-0.75597,g
1,0,0.93147,0.29282,0.79917,0.55756,0.59952,0.71596,0.26203,0.92651,0.04636,0.96748,-0.23237,0.95130,-0.55926,0.81018,-0.73329,0.62385,-0.90995,0.36200,-0.92254,0.06040,-0.93618,-0.19838,-0.83192,-0.46906,-0.65165,-0.69556,-0.41223,-0.85725,-0.13590,-0.93953,0.10007,-0.94823,g
1,0,0.88241,0.30634,0.73232,0.57816,0.34109,0.58527,0.05717,1,-0.09238,0.92118,-0.62403,0.71996,-0.69767,0.32558,-0.81422,0.41195,-1,-0.00775,-0.78973,-0.41085,-0.76901,-0.45478,-0.57242,-0.67605,-0.31610,-0.81876,-0.02979,-0.86841,0.25392,-0.82127,0.00194,-0.81686,g
1,0,0.83479,0.28993,0.69256,0.47702,0.49234,0.68381,0.21991,0.86761,-0.08096,0.85011,-0.35558,0.77681,-0.52735,0.58425,-0.70350,0.31291,-0.75821,0.03939,-0.71225,-0.15317,-0.58315,-0.39168,-0.37199,-0.52954,-0.16950,-0.60863,0.08425,-0.61488,0.25164,-0.48468,0.40591,-0.35339,g
1,0,0.92870,0.33164,0.76168,0.62349,0.49305,0.84266,0.21592,0.95193,-0.13956,0.96167,-0.47202,0.83590,-0.70747,0.65490,-0.87474,0.36750,-0.91814,0.05595,-0.89824,-0.26173,-0.73969,-0.54069,-0.50757,-0.74735,-0.22323,-0.86122,0.07810,-0.87159,0.36021,-0.78057,0.59407,-0.60270,g

Exécutez l'algorithme

import numpy as np
import csv
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

# 新建特征数据,默认为float类型
X = np.zeros((351, 34), dtype="float")
# 新建类别数据
y = np.zeros((351,), dtype="bool")

# 读取数据集并且赋值
with open("ionosphere.data", "r") as input_file:
    reader = csv.reader(input_file)
    for i, row in enumerate(reader):
        data = [float(datum) for datum in row[:-1]]
        X[i] = data
        y[i] = row[-1] == 'g'


# 对数据进行分割,创建训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=14)

# 建立KNN模型
estimator = KNeighborsClassifier()
# 使用训练数据进行训练
estimator.fit(X_train, y_train)
# 用测试集测试算法,评估它在测试集上的表现
y_predicted = estimator.predict(X_test)
# 查看正确率
accuracy = np.mean(y_test == y_predicted) * 100
print("{:.1f}".format(accuracy))

Les résultats sont les suivants:

86,4%

Vérification croisée

Dans le code ci-dessus, nous divisons au hasard l'ensemble de données en un ensemble d'apprentissage et un ensemble de test, utilisons l'ensemble d'apprentissage pour entraîner l'algorithme et évaluons l'effet sur l'ensemble de test. Mais comme il est attribué au hasard et testé une seule fois, il y aura une chance.
La vérification croisée peut résoudre les problèmes causés par le test unique ci-dessus. Son implémentation consiste à diviser le jeu de données plusieurs fois, et chaque division doit être différente de la dernière division. Assurez-vous également que chaque donnée ne peut être utilisée qu'une seule fois pour le test. L'algorithme est décrit comme suit:

  1. Divisez l'ensemble de données en plusieurs parties
  2. Effectuer les opérations suivantes pour chaque partie
    (1), utiliser une partie comme ensemble de test actuel
    (2), utiliser la partie restante pour entraîner l'algorithme
    (3), tester l'algorithme sur l'ensemble de test actuel
  3. Enregistrez chaque score et score moyen
  4. Dans le processus ci-dessus, chaque élément de données ne peut apparaître qu'une seule fois dans l'ensemble de test pour réduire (mais pas complètement éluder) la composante chance

Une fonction auxiliaire cross_val_score est fournie dans la bibliothèque sklearn pour implémenter les étapes de vérification croisée ci-dessus

from sklearn.model_selection import cross_val_score

# 进行交叉检验
scores = cross_val_score(estimator, X, y, scoring="accuracy")
# 求平均得分
average_accurancy = np.mean(scores) * 100
print("{:.1f}".format(average_accurancy))

Remarque: ce code est connecté au code précédent et le résultat en cours d'exécution est le suivant:

82,3%

Le résultat est de 82,3%, ce qui montre que la segmentation de l'ensemble d'apprentissage et de l'ensemble de test a un certain impact sur la précision de l'algorithme. Ensuite, nous ajusterons les paramètres pour améliorer la précision de l'algorithme.

Paramètres de réglage

Presque tous les algorithmes d'exploration de données peuvent définir des paramètres, ce qui a pour avantage d'améliorer la capacité de généralisation de l'algorithme. Le réglage des paramètres peut affecter directement la précision de l'algorithme et les paramètres sélectionnés sont liés aux caractéristiques de l'ensemble de données.

L'algorithme KNN a plusieurs paramètres. La chose la plus importante est de sélectionner le nombre de voisins utilisés comme base de prédiction. Ensuite, en définissant différents paramètres pour mener plusieurs expériences afin d'observer la différence entre les résultats apportés par différentes valeurs de paramètres.

# 保存不同参数下的平均分
avg_socre = []
# 参数从1-20
para = list(range(1, 21))
# 对每个参数进行交叉检验,将结果保存到列表
for o in para:
    estimator = KNeighborsClassifier(n_neighbors=o)
    score = cross_val_score(estimator, X, y, scoring="accuracy")
    avg_socre.append(np.mean(score))
from matplotlib import pyplot as plt
# 可视化处理
plt.plot(para, avg_socre, "-o")
plt.show()

Les résultats sont indiqués sur la figure:
Écrivez la description de l'image ici

Comme on peut le voir sur la figure ci-dessus, à mesure que la valeur du paramètre augmente, la précision de l'algorithme diminue continuellement

Je suppose que tu aimes

Origine blog.csdn.net/mrliqifeng/article/details/82592867
conseillé
Classement