Оглавление:
- Отношения между объектами
- Желаемый график
- Почему подходят и предсказывают?
- Построение 8 объектов?
Отношения между признаками:
Научный термин, характеризующий "связь" между признаками, - корреляция .Эта область в основном исследована во время PCA (Анализ основных компонентов) .Идея в том, что не все ваши функции важны или, по крайней мере, некоторые из них сильно коррелированы.Думайте об этом как о сходстве: если две функции сильно коррелированы, поэтому они содержат одну и ту же информацию, и, следовательно, вы можете отбросить одну из них.Используя панд это выглядит так:
import pandas as pd
import seaborn as sns
from pylab import rcParams
import matplotlib.pyplot as plt
def plot_correlation(data):
'''
plot correlation's matrix to explore dependency between features
'''
# init figure size
rcParams['figure.figsize'] = 15, 20
fig = plt.figure()
sns.heatmap(data.corr(), annot=True, fmt=".2f")
plt.show()
fig.savefig('corr.png')
# load your data
data = pd.read_csv('diabetes.csv')
# plot correlation & densities
plot_correlation(data)
На выходе получается следующая корреляционная матрица:
Так что здесь 1 означает общеекорреляция и, как и ожидалось, диагональ - это все единицы, потому что объект полностью коррелирует с самим собой.Кроме того, чем меньше число, тем меньше взаимосвязанных функций.
Здесь мы должны рассмотреть корреляции между характеристиками и корреляции между результатами и характеристиками.Между функциями: более высокие корреляции означают, что мы можем отбросить одну из них.Однако высокая корреляция между функцией и результатом означает, что функция важна и содержит много информации.На нашем графике последняя строка представляет корреляцию между характеристиками и результатом.Соответственно, самые высокие значения / наиболее важные характеристики - это «глюкоза» (0,47) и «MBI» (0,29).Кроме того, корреляция между этими двумя относительно низка (0,22), что означает, что они не похожи.
Мы можем проверить эти результаты, используя графики плотности для каждого объекта, имеющие отношение к результату.Это не так сложно, так как у нас есть только два результата: 0 или 1. Так что это будет выглядеть так в коде:
import pandas as pd
from pylab import rcParams
import matplotlib.pyplot as plt
def plot_densities(data):
'''
Plot features densities depending on the outcome values
'''
# change fig size to fit all subplots beautifully
rcParams['figure.figsize'] = 15, 20
# separate data based on outcome values
outcome_0 = data[data['Outcome'] == 0]
outcome_1 = data[data['Outcome'] == 1]
# init figure
fig, axs = plt.subplots(8, 1)
fig.suptitle('Features densities for different outcomes 0/1')
plt.subplots_adjust(left = 0.25, right = 0.9, bottom = 0.1, top = 0.95,
wspace = 0.2, hspace = 0.9)
# plot densities for outcomes
for column_name in names[:-1]:
ax = axs[names.index(column_name)]
#plt.subplot(4, 2, names.index(column_name) + 1)
outcome_0[column_name].plot(kind='density', ax=ax, subplots=True,
sharex=False, color="red", legend=True,
label=column_name + ' for Outcome = 0')
outcome_1[column_name].plot(kind='density', ax=ax, subplots=True,
sharex=False, color="green", legend=True,
label=column_name + ' for Outcome = 1')
ax.set_xlabel(column_name + ' values')
ax.set_title(column_name + ' density')
ax.grid('on')
plt.show()
fig.savefig('densities.png')
# load your data
data = pd.read_csv('diabetes.csv')
names = list(data.columns)
# plot correlation & densities
plot_densities(data)
На выходе получаются следующие графики плотности:
На графиках, когда зеленая и красная кривые почти совпадают (перекрываются), это означает, что функция не разделяет результаты.В случае «ИМТ» вы можете увидеть некоторое разделение (небольшое горизонтальное смещение между обеими кривыми), а в «Глюкозе» это гораздо яснее (это согласуется со значениями корреляции).
=> Вывод из этого: если нам нужно выбрать только 2 функции, то нужно выбрать «Глюкоза» и «MBI».
Нужный график
Мне нечего сказать по этому поводу, за исключением того, что график представляет собой базовое объяснение концепции k-ближайшего соседа.Это просто не представление классификации.
Почему подходят и предсказывают
Ну, это базовое и жизненно важное машинное обучение (ML)концепция.У вас есть набор данных = [input, related_outputs], и вы хотите построить алгоритм ML, который хорошо научится связывать входы с их related_outputs.Это двухэтапная процедура.Сначала вы тренируете / обучаете свой алгоритм тому, как это делается.На этом этапе вы просто даете ему входные данные и ответы, как вы делаете с ребенком.Второй шаг - тестирование;теперь, когда ребенок научился, вы хотите проверить его / его.Таким образом, вы предоставляете ей / ему подобные данные и проверяете, верны ли ее / его ответы.Теперь вы не хотите давать ей / ему те же данные, которые он выучил, потому что даже если она / он дает правильные ответы, она / она, возможно, просто запомнили ответы из фазы обучения (это называется переоснащение ) и поэтому она / он ничему не научился.
Аналогично с вашим алгоритмом, вы сначала разбиваете свой набор данных на тренировочные данные и данные тестирования.Затем вы вписываете свои тренировочные данные в свой алгоритм или классификатор.Это называется этапом обучения.После этого вы проверяете, насколько хорош ваш классификатор и может ли он правильно классифицировать новые данные.Это этап тестирования.На основе результатов тестирования вы оцениваете эффективность своей классификации, используя, например, различные метрики оценки , например, точность.Правило большого пальца здесь состоит в том, чтобы использовать 2/3 данных для обучения и 1/3 для тестирования.
Создание 8 объектов?
Простой ответ - нет, вы не можете, и если можете, скажите, пожалуйста, как.
Забавный ответ: для визуализации 8 измерений это просто ... простопредставьте n-измерения, а затем пусть n = 8 или просто визуализируйте 3-D и кричите на него 8.
Логический ответ: Итак, мы живем в физическом слове и объектах, которые видим3-мерные, так что это технически своего рода предел.Тем не менее, вы можете визуализировать 4-е измерение в виде цвета, как в здесь , вы также можете использовать время в качестве 5-го измерения и сделать свой график анимацией.@Rohan предложил в своих формах ответа, но его код не работал для меня, и я не вижу, как это обеспечило бы хорошее представление производительности алгоритма.Во всяком случае, цвета, время, формы ... через некоторое время у вас кончается и вы застряли.Это одна из причин, почему люди делают PCA.Вы можете прочитать об этом аспекте проблемы в разделе уменьшение размерности .
Так что же произойдет, если мы согласимся на 2 объекта после PCA, а затем проведем обучение, тестирование, оценку и построение графика?.
Итак, вы можете использовать следующий код для достижения этой цели:
import warnings
import numpy as np
import pandas as pd
from pylab import rcParams
import matplotlib.pyplot as plt
from sklearn import neighbors
from matplotlib.colors import ListedColormap
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
# filter warnings
warnings.filterwarnings("ignore")
def accuracy(k, X_train, y_train, X_test, y_test):
'''
compute accuracy of the classification based on k values
'''
# instantiate learning model and fit data
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
# predict the response
pred = knn.predict(X_test)
# evaluate and return accuracy
return accuracy_score(y_test, pred)
def classify_and_plot(X, y):
'''
split data, fit, classify, plot and evaluate results
'''
# split data into training and testing set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.33, random_state = 41)
# init vars
n_neighbors = 5
h = .02 # step size in the mesh
# Create color maps
cmap_light = ListedColormap(['#FFAAAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#0000FF'])
rcParams['figure.figsize'] = 5, 5
for weights in ['uniform', 'distance']:
# we create an instance of Neighbours Classifier and fit the data.
clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
clf.fit(X_train, y_train)
# 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)
fig = plt.figure()
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)
# Plot also the training points, x-axis = 'Glucose', y-axis = "BMI"
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold, edgecolor='k', s=20)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("0/1 outcome classification (k = %i, weights = '%s')" % (n_neighbors, weights))
plt.show()
fig.savefig(weights +'.png')
# evaluate
y_expected = y_test
y_predicted = clf.predict(X_test)
# print results
print('----------------------------------------------------------------------')
print('Classification report')
print('----------------------------------------------------------------------')
print('\n', classification_report(y_expected, y_predicted))
print('----------------------------------------------------------------------')
print('Accuracy = %5s' % round(accuracy(n_neighbors, X_train, y_train, X_test, y_test), 3))
print('----------------------------------------------------------------------')
# load your data
data = pd.read_csv('diabetes.csv')
names = list(data.columns)
# we only take the best two features and prepare them for the KNN classifier
rows_nbr = 30 # data.shape[0]
X_prime = np.array(data.iloc[:rows_nbr, [1,5]])
X = X_prime # preprocessing.scale(X_prime)
y = np.array(data.iloc[:rows_nbr, 8])
# classify, evaluate and plot results
classify_and_plot(X, y)
Это приводит к следующим графикам границ решения с использованием весов = 'равномерное' и весов = 'расстояние' (длячитайте разницу между обоими ходами здесь ):
Примечаниечто: ось x = 'глюкоза', ось y = 'BMI'
Улучшения:
значение K What kзначение для использования?сколько соседей считать.Низкие значения k означают меньшую зависимость между данными, но большие значения означают более длительное время выполнения.Так что это компромисс.Вы можете использовать этот код, чтобы найти значение k, обеспечивающее наивысшую точность:
best_n_neighbours = np.argmax(np.array([accuracy(k, X_train, y_train, X_test, y_test) for k in range(1, int(rows_nbr/2))])) + 1
print('For best accuracy use k = ', best_n_neighbours)
Использование дополнительных данных Таким образом, при использовании всех данных вы можете столкнуться с проблемами памяти (какЯ сделал) другой, то вопрос переоснащения.Вы можете преодолеть это, предварительно обработав ваши данные.Рассматривайте это как масштабирование и форматирование ваших данных.В коде просто используйте:
from sklearn import preprocessing
X = preprocessing.scale(X_prime)
Полный код можно найти в этом gist