Что такое КНН?
Алгоритм k-ближайших соседей, также известный как KNN или k-NN, представляет собой непараметрический классификатор с контролируемым обучением, который использует близость для классификации или прогнозирования группировки отдельных точек данных. Хотя его можно использовать как для задач регрессии, так и для задач классификации, обычно он используется в качестве алгоритма классификации, основанного на предположении, что похожие точки могут быть найдены рядом друг с другом.
Его также называют алгоритмом ленивого обучения, потому что он не обучается сразу на обучающем наборе, а сохраняет набор данных и во время классификации выполняет действие над набором данных. KNN используется, когда у нас есть две категории данных For. Например, категория A и категория B, и если у нас есть новая точка данных x1, мы можем использовать KNN для классификации того, где эта новая точка данных будет находиться между категориями.
Давайте посмотрим на набор данных об оттоке клиентов и посмотрим, сможем ли мы сгруппировать клиентов, будут ли они уходить или нет. У нас есть набор данных со следующими метками, которые мы будем исследовать.
# Import KNeighborsClassifier
from sklearn.neighbors import KNeighborsClassifier
# Create arrays for the features and the target variable
y = churn_df["churn"].values
X = churn_df[["account_length", "customer_service_calls"]].values
# Create a KNN classifier with 6 neighbors
knn = KNeighborsClassifier(n_neighbors=6)
# Fit the classifier to the data
knn.fit(X, y)
# Predict the labels for the X_new
y_pred = knn.predict(X_new)
# Print the predictions for X_new
print("Predictions: {}".format(y_pred))
X_new = np.array([[30.0, 17.5],
[107.0, 24.1],
[213.0, 10.9]])
Predictions: [0 1 0]
Как видно из прогнозов, модель предсказала, что первый и третий клиенты не будут уходить в новом массиве.
Далее мы можем исследовать точность модели, используя точность разделения обучения/тестирования.
# Import the module from sklearn.model_selection import train_test_split #Establishing the Features X = churn_df.drop("churn", axis=1).values #Establishing the Labels/Dependent variables. y = churn_df["churn"].values # Split into training and test sets X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y) knn = KNeighborsClassifier(n_neighbors=5) # Fit the classifier to the training data knn.fit(X_train,y_train) # Print the accuracy print(knn.score(X_test, y_test)) 0.8740629685157422
Мы смогли увидеть соответствие модели KNN и обнаружили, что ее точность составляет 87%.
Переоснащение и недооснащение
Интерпретация сложности модели — отличный способ оценить производительность при использовании обучения с учителем. Наша цель — создать модель, которая может интерпретировать взаимосвязь между признаками и целевой переменной, а также хорошо обобщать при воздействии новых наблюдений. Мы можем генерировать оценки точности для обучающих и тестовых наборов, используя классификатор KNN с разными значениями n_neighbor
.
# Create neighbors neighbors = np.arange(1, 13) train_accuracies = {} test_accuracies = {} for neighbor in neighbors: # Set up a KNN Classifier knn = KNeighborsClassifier(n_neighbors=neighbor) # Fit the model knn.fit(X_train, y_train) # Compute accuracy train_accuracies[neighbor] = knn.score(X_train, y_train) test_accuracies[neighbor] = knn.score(X_test, y_test) print(neighbors, '\n', train_accuracies, '\n', test_accuracies) [ 1 2 3 4 5 6 7 8 9 10 11 12] {1: 1.0, 2: 0.887943971985993, 3: 0.9069534767383692, 4: 0.8734367183591796, 5: 0.8829414707353677, 6: 0.8689344672336168, 7: 0.8754377188594297, 8: 0.8659329664832416, 9: 0.8679339669834918, 10: 0.8629314657328664, 11: 0.864432216108054, 12: 0.8604302151075538} {1: 0.7871064467766117, 2: 0.8500749625187406, 3: 0.8425787106446777, 4: 0.856071964017991, 5: 0.8553223388305847, 6: 0.861319340329835, 7: 0.863568215892054, 8: 0.8605697151424287, 9: 0.8620689655172413, 10: 0.8598200899550225, 11: 0.8598200899550225, 12: 0.8590704647676162}
Мы можем видеть, как точность обучения уменьшается по мере того, как число соседей изначально увеличивается, и наоборот для точности тестирования. Теперь, когда мы рассчитали точность модели KNN на обучающем и тестовом наборах, используя различные значения n_neighbors
, вы можете создать кривую сложности модели, чтобы визуализировать, как производительность меняется по мере того, как модель становится менее сложной.
# Add a title plt.title("KNN: Varying Number of Neighbors") # Plot training accuracies plt.plot(neighbors, train_accuracies.values(), label="Training Accuracy") # Plot test accuracies plt.plot(neighbors, test_accuracies.values(), label="Testing Accuracy") plt.legend() plt.xlabel("Number of Neighbors") plt.ylabel("Accuracy") # Display the plot plt.show()
Мы видим, что точность обучения уменьшается, а точность теста увеличивается по мере увеличения числа соседей. Для тестового набора точность достигает максимума при 13 соседях, что позволяет предположить, что это оптимальное значение для нашей модели.
Таким образом, на этом простом примере мы увидели, как мы можем использовать KNN для классификации клиентов, которые будут уходить.
Источник: datacamp.com