Что такое КНН?

Алгоритм 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