Найти ошибки обучения и теста в моем собственном реализованном алгоритме kNN - PullRequest
0 голосов
/ 07 октября 2018

Я реализовал свой собственный алгоритм kNN с набором данных iris в python.Теперь я хотел бы иметь возможность сообщить об ошибке обучения и теста для различных видов k.Я вычислил точность своих прогнозов, но не знаю, как из этого извлечь ошибки обучения и тестирования.Есть идеи?

Заранее спасибо

РЕДАКТИРОВАТЬ: Вот код

import pandas as pd
import math
import operator
from sklearn.model_selection import train_test_split


def euclideanDistance(instance1, instance2, length):
    distance = 0
    for x in range(length):
        distance += pow((instance1[x] - instance2[x]), 2)
    return math.sqrt(distance)


def getNeighbors(trainingSet, testInstance, k):
    distances = []
    length = len(testInstance) - 1
    for x in range(len(trainingSet)):
        dist = euclideanDistance(testInstance, trainingSet.iloc[x], length)
        distances.append((trainingSet.iloc[x], dist))
    distances.sort(key=operator.itemgetter(1))
    neighbors = []
    for x in range(k):
        neighbors.append(distances[x][0])
    return neighbors


def getResponse(neighbors):
    classVotes = {}
    for x in range(len(neighbors)):
        response = neighbors[x][-1]
        if response in classVotes:
            classVotes[response] += 1
        else:
            classVotes[response] = 1
        sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True)

    return sortedVotes[0][0]


def getAccuracy(testSet, predictions):
    correct = 0
    for x in range(len(testSet)):
        if testSet.iloc[x][-1] == predictions[x]:
            correct += 1
    return (correct / float(len(testSet))) * 100.0


def main():
    dataset = pd.read_csv('DataScience/iris.data.txt',
                          names=["Atr1", "Atr2", "Atr3", "Atr4", "Class"])

    x = dataset.drop(['Class'], axis=1)
    y = dataset.drop(["Atr1", "Atr2", "Atr3", "Atr4"], axis=1)

    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.5, random_state=65, stratify=y)

trainingSet = pd.concat([x_train, y_train], axis=1)
testSet = pd.concat([x_test, y_test], axis=1)
# prepare data

# generate predictions
predictions = []
k = 5
for x in range(len(testSet)):
    neighbors = getNeighbors(trainingSet, testSet.iloc[x], k)
    result = getResponse(neighbors)
    predictions.append(result)
    print('> predicted=' + repr(result) + ', actual=' + repr(testSet.iloc[x][-1]))
accuracy = getAccuracy(testSet, predictions)
print('Accuracy: ' + repr(accuracy) + '%')

main ()

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Вы можете считать ошибки обучения и тестирования оборотной стороной вашей точности.Например, если вы на 60% точны в тестировании, у вас будет около 40% ошибок в тестировании.Обычно вы можете построить график зависимости точности от k, чтобы понять, как ваш алгоритм работает с разными k.

from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier 
import matplotlib.pyplot as plt

# create a training and testing set (use your X and y)    
X_train,X_test, y_train, y_test= train_test_split(X,y,random_state=42, test_size=.3)
# create a set of k values and an empty list for training and testing accuracy scores
k_values=[1,2,3,4,5,6,7,8,9,10]
train_scores=[]
test_scores=[]
# instantiate the model 
k_nn=KNeighborsClassifier()
# create a for loop of models with different k's 

for k in k_values: 
  k_nn.n_neighbors=k 
  k_nn.fit(X_train,y_train)
  train_score=k_nn.score(X_train,y_train)
  test_score=k_nn.score(X_test,y_test)
  train_scores.append(train_score)
  test_scores.append(test_score)

plt.plot(k_values,train_scores, color='red',label='Training Accuracy')
plt.plot(k_values,test_scores, color='blue',label='Testing Accuracy')
plt.xlabel('K values')
plt.ylabel('Accuracy Score')
plt.title('Performace Under Varying K Values')    
0 голосов
/ 07 октября 2018

Ошибка обучения и ошибка теста - это просто ошибка при прогнозировании на обучающем наборе и тестовом наборе, соответственно.

Все, что вам нужно сделать, это измерить предсказания на вашем обучающем наборе и тестовом наборе.

...