KNN 最邻近

一、KNN介绍

  • 既可以做回归也可以做分类
  • k邻近的3要素
    (1) 选择合适的K(一般选奇数):通过交叉验证来选
    (2) 距离选择:欧式距离、曼哈顿距离、余弦值、相关度
    (3) 决策规则:投票、均值
  • 算法流程
    (1) 把一个物体表示成向量:特征工程
    (2) 标记每个物体的标签
    (3) 选择合适的K
    (4) 计算两个物体之间的距离/相似度
  1. 调用KNN函数来实现分类
# 读取相应的库
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
# 读取数据 X, y
iris = datasets.load_iris()
X = iris.data
y = iris.target
print (X, y)
# 把数据分成训练数据和测试数据
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=2003)
# 构建KNN模型, K值为3、 并做训练
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X_train, y_train)
# 计算准确率
from sklearn.metrics import accuracy_score
correct = np.count_nonzero((clf.predict(X_test)==y_test)==True)
#accuracy_score(y_test, clf.predict(X_test))
print ("Accuracy is: %.3f" %(correct/len(X_test)))

2.自己准备数据KNN实现

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
#读取数据
df = pd.read_csv('data.csv')
#清洗数据
# 把颜色独热编码
df_colors = df['Color'].str.get_dummies().add_prefix('Color: ')
# 把类型独热编码
df_type = df['Type'].apply(str).str.get_dummies().add_prefix('Type: ')
# 添加独热编码数据列
df = pd.concat([df, df_colors, df_type], axis=1)
# 去除独热编码对应的原始列
df = df.drop(['Brand', 'Type', 'Color'], axis=1)
# 数据转换
matrix = df.corr()
f, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(matrix, square=True)
plt.title('Car Price Variables')
from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler
import numpy as np
X = df[['Construction Year', 'Days Until MOT', 'Odometer']]
y = df['Ask Price'].values.reshape(-1, 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=41)
X_normalizer = StandardScaler() # N(0,1)
X_train = X_normalizer.fit_transform(X_train)
X_test = X_normalizer.transform(X_test)
y_normalizer = StandardScaler()
y_train = y_normalizer.fit_transform(y_train)
y_test = y_normalizer.transform(y_test)
knn = KNeighborsRegressor(n_neighbors=2)
knn.fit(X_train, y_train.ravel())
#Now we can predict prices:
y_pred = knn.predict(X_test)
y_pred_inv = y_normalizer.inverse_transform(y_pred)
y_test_inv = y_normalizer.inverse_transform(y_test)
# Build a plot
plt.scatter(y_pred_inv, y_test_inv)
plt.xlabel('Prediction')
plt.ylabel('Real value')
# Now add the perfect prediction line
diagonal = np.linspace(500, 1500, 100)
plt.plot(diagonal, diagonal, '-r')
plt.xlabel('Predicted ask price')
plt.ylabel('Ask price')
plt.show()
print(y_pred_inv)
pred = knn.predict(X_test)
from sklearn.metrics import mean_absolute_error
acc = mean_absolute_error(y_pred_inv, y_test_inv)

data的内容

二、知识补充

  • 参数
    • 模型参数:
    • 超参数:模型外面的参数
  • 交叉验证:把训练数据进一步分成训练数据和验证集。选择在验证集数据李最好的超参数组合。
    交叉验证图
  • 特征标准化

三、KNN延伸

  • kNN时间复杂度:O(N),N是样本总数

  • KD树,时间复杂度O(logN);对于数据维度d来说,指数级复杂度。

  • LSH:把样本分在不同的bucket,使得距离较近的样本较大概率在同一个bucket里。是一个近似的方法。


    image.png
  • 处理特征之间的相关性:曼哈顿距离

  • 处理样本的重要性


    image.png
  • 利用Kernel Trick


    image.png

四、总结

  • KNN比较适合应用在低维空间
  • 预测的时候复杂度高,对于大数据需要一定的处理

你可能感兴趣的:(KNN 最邻近)