Расчет Knn в python - PullRequest
       87

Расчет Knn в python

0 голосов
/ 20 марта 2020

Я хотел бы написать функцию, которая возвращает число, содержащее категорию большинства.

Я написал следующую функцию для вычисления расстояний.

расстояние метри c дано (Евклид, Мантан и др.).

xTrainInstances - это фрейм данных, включающий все экземпляры поездов

xSeriesTestVector - это объект Series из набора тестов

 def calc_distances(xSeriesTestVector, xTrainInstances, distanceMetric):
 distances = np.zeros(xTrainInstances.shape[0])
 for i in range(xTrainInstances.shape[0]):
    distances[i] = distanceMetric(xSeriesTestVector, xTrainInstances.iloc[i])
return distances

предположим, у меня есть следующий фрейм данных, сохранившийся столбец - моя категория.

                    Survived
 PassengerId          
    1                   0
    2                   1
    3                   1
    4                   1
    5                   0

Мой вопрос

Я хотел бы знать, как реализовать следующую функцию? Я застрял, расстояния возвращают мне массив расстояний. Из функции Foret_one_instance я хотел бы вернуть правильную категорию

  • xSeriesTestVector - это объект Series, из набора тестов для классификации
  • xTrainInstances - кадр данных, включающий все экземпляры поездов для сравнения с
  • yTrainCategories - кадр данных, включающий все категории поездов
  • distanceMetri c - название функции расстояния, не в виде строки
  • k - количество ближайших соседей (мы выбираем большинство из k голосов)

                        Pclass  SibSp  Parch     Fare   Age
         pid
         1                 3      1      0   7.2500  22.0
         2                 1      1      0  71.2833  38.0
         3                 3      0      0   7.9250  26.0
         4                 1      1      0  53.1000  35.0
         5                 3      0      0   8.0500  35.0
                         Pclass  SibSp  Parch     Fare   Age
         pid
         1                 3      1      0   7.2500  22.0
         2                 1      1      0  71.2833  38.0
         3                 3      0      0   7.9250  26.0
         4                 1      1      0  53.1000  35.0
         5                 3      0      0   8.0500  35.0
    
    
        def predict_one_instance(xSeriesTestVector, 
            xTrainInstances,yTrainCategories,distanceMetric,k):
    
            distances = calc_distances(xSeriesTestVector, xTrainInstances,distanceMetric)
    

1 Ответ

0 голосов
/ 21 марта 2020

Пожалуйста, посмотрите на этот пример, используя 'manhattan'

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd


url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

# Assign colum names to the dataset
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']

# Read dataset to pandas dataframe
dataset = pd.read_csv(url, names=names)


dataset.head()


X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values


from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)


from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)

X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)


from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors=5, metric='manhattan')
classifier.fit(X_train, y_train)


y_pred = classifier.predict(X_test)


from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

Три в основном схожих, но немного отличающихся результата

# manhattan
                 precision    recall  f1-score   support

    Iris-setosa       1.00      1.00      1.00         9
Iris-versicolor       1.00      1.00      1.00        15
 Iris-virginica       1.00      1.00      1.00         6

       accuracy                           1.00        30
      macro avg       1.00      1.00      1.00        30
   weighted avg       1.00      1.00      1.00        30


# euclidian
                 precision    recall  f1-score   support

    Iris-setosa       1.00      1.00      1.00        11
Iris-versicolor       0.90      1.00      0.95         9
 Iris-virginica       1.00      0.90      0.95        10

       accuracy                           0.97        30
      macro avg       0.97      0.97      0.96        30
   weighted avg       0.97      0.97      0.97        30


# minkowski
                 precision    recall  f1-score   support

    Iris-setosa       1.00      1.00      1.00        13
Iris-versicolor       1.00      0.85      0.92        13
 Iris-virginica       0.67      1.00      0.80         4

       accuracy                           0.93        30
      macro avg       0.89      0.95      0.91        30
   weighted avg       0.96      0.93      0.94        30

Просто измените метри c, когда Вы запускаете эти 3 примера (вы можете легко l oop через эти три элемента в списке, чтобы автоматизировать весь процесс):

metric='manhattan'
metric='euclidian'
metric='minkowski'

Ресурс:

https://www.bogotobogo.com/python/scikit-learn/scikit_machine_learning_k-NN_k-nearest-neighbors-algorithm.php

...