分类模型之KNN

KNN算法的概念比较好理解,简单总结:
1.距离概念
闵可夫斯基距离:在这里插入图片描述
当p =1时,为曼哈顿距离
曼哈顿距离为平面x1点做关于y的垂线,x2做关于x的垂线,取使两点连通部分。d(i,j)=|X1-X2|+|Y1-Y2|
分类模型之KNN_第1张图片
当p =2时,为欧式距离
欧式距离为点到点的最短距离
分类模型之KNN_第2张图片
2.kd_tree
如果判断一个点到平面内点的距离:
1。可以选择遍历到所有点的距离
2。可以采用kd_tree
kd_tree思想:
在同一个平面(维度)把所有点尽可能的分成同样数量的两个部分,无线切分,直到不能切分为止。这样以切分的那条线作为索引,把分割线作为中间结点,图中的点作为叶子结点,可以的到一课树状结构。这样,就很容易找到一个点附近的k个点。比如,随机在图中出现一个点,我们可以快速的确定这个点和哪个叶子结点出现在同一个区间,然后来计算新出现的点和叶子结点的距离,以这个距离为半径,可以轻松得到与哪一个中间结点更近,更快的找到附近更近的叶子节点。

KNN算法优点:
1.很明显,它比较适合多样本分类。因为是根据距离来判断属于那个样本
2.适合对稀有事件的分类。只考虑距离,不存在权重问题
KNN算法缺点:
1.如果样本分布不均衡,那正确率会相当低。如果n_neighbors取5,5个点中有4个负样本1正样本,结果既为负样本。

实例说明:
分类模型之KNN_第3张图片

# -*-coding:utf-8-*-

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv('data/ex4x.dat', names=['score1', 'score2', 'admit'])
df_admint = df[df['admit'] == 1]
df_noadmint = df[df['admit'] == 0]
plt.scatter(df_admint['score1'], df_admint['score2'], marker='o', c='r')
plt.scatter(df_noadmint['score1'], df_noadmint['score2'], marker='x', c='b')
plt.show()
y_train = df.pop('admit')
print y_train[62]
df = df.values

from sklearn.model_selection import KFold

kf = KFold(n_splits=5, shuffle=True, random_state=0)

for train_index, test_index in kf.split(df):
    df_tarin = df[train_index]
    y_tarin = y_train[train_index]

    df_test = df[test_index]
    y_test = y_train[test_index]

# NearestNeighbors 可以用来确定 这个一个附近的几个点
from sklearn.neighbors import NearestNeighbors, KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(df_tarin,y_tarin)
y_predict = knn.predict(df_test)
print y_predict
from sklearn.metrics import accuracy_score,recall_score,f1_score
print "accuracy_score = %s"%accuracy_score(y_predict,y_test)
print "recall_score = %s"%recall_score(y_predict,y_test)
print "f1_score = %s"%f1_score(y_predict,y_test)
[1 1 1 0 1 0 0 1 0 1 0 0 0]
accuracy_score = 0.7692307692307693
recall_score = 0.6666666666666666
f1_score = 0.7272727272727272

你可能感兴趣的:(machine,learning)