Количество классифицированных и нанесенных на график точек данных не соответствует количеству точек в наборе данных. - PullRequest
0 голосов
/ 07 мая 2018

Я использую набор данных, который имеет 54 точки данных, которые должны быть классифицированы в Python с использованием классификатора k-NN с числом соседей: 20. Мой код выполняет классификацию и выводит результаты, но я вижу только 22 точки данных на моем графике рассеяния, не 54 данные классифицируются.

Есть ли причина в машинном обучении, почему все точки данных не классифицируются и не наносятся на график?

Влияет ли количество выбранных соседей на количество классифицированных и нанесенных на график точек данных? Спасибо.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import neighbors, datasets
import pandas as pd
from sklearn import preprocessing

# Preprocessing of dataset done here.
n_neighbors = 20
dataset = pd.read_csv('cereal.csv')
X = dataset.iloc[:, [3,5]].values
y = dataset.iloc[:, 1].values
y_set = preprocessing.LabelEncoder()
y_fit = y_set.fit(y)
y_trans = y_set.transform(y)

# sorting dataset done here.Total number of data points :77 but 54 will 
# be selected to use
j = 0
for i in range (0,77):
if y[i] == 'K' or y[i] == 'G' or y[i] == 'P':
    j = j+1

new_data = np.zeros((j,2))
new_let = [0] * j
j = 0

for i in range (0,77):
if y[i] == 'K' or y[i] == 'G' or y[i] == 'P':
    new_data[j] = X[i]
    new_let[j] = y[i]
    j = j+1

# Plotting and setting up mesh grid done here

h = .02
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])

for weights in ['uniform', 'distance']:
# we create an instance of Neighbours Cylassifier and fit the data.
clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
clf.fit(X, y_trans)

# Plot the decision boundary. For that, we will assign a color to each
# point in the mesh [x_min, x_max]x[y_min, y_max].

x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                     np.arange(y_min, y_max, h))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)

plt.scatter(X[:, 0], X[:, 1], c=y_trans, cmap=cmap_bold,
            edgecolor='k', s=20)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("3-Class classification (k = %i, weights = '%s')"
          % (n_neighbors, weights))
plt.show()

1 Ответ

0 голосов
/ 07 мая 2018

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

Вы должны проверить обозреватель переменных в Anaconda после запуска сценария, чтобы увидеть размеры различных переменных, которые вы используете.

Что касается создаваемого вами графика, если вы посмотрите, как распределяются данные, вы поймете, почему вы видите только 22 пункта:

Cereal K-NN

Если вы посмотрите на исходный набор данных, есть несколько точек, которые имеют одинаковые значения в этих двух столбцах (жир и калории). В результате на графике несколько точек накладываются друг на друга, поэтому, хотя вы наносите 77 точек, на своем графике вы «видите» только 22 из них. Возможно, вы захотите выбрать какой-нибудь другой атрибут, если хотите, чтобы все они были хорошо разделены.

...