KNN算法及其python实现

邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import warnings
import sklearn
from sklearn.linear_model import LogisticRegressionCV
from sklearn.linear_model.coordinate_descent import ConvergenceWarning
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier#KNN
from sklearn.preprocessing import label_binarize
from sklearn import metrics

## 设置字符集,防止中文乱码
mpl.rcParams['font.sans-serif']=[u'Arial Unicode MS']
mpl.rcParams['axes.unicode_minus']=False
## 拦截异常
warnings.filterwarnings(action = 'ignore', category=ConvergenceWarning)

## 数据加载
path = "/datas/iris.data"#这里选取的是iris数据
names = ['sepal length', 'sepal width', 'petal length', 'petal width', 'cla']
df = pd.read_csv(path, header=None, names=names)

#编写转化函数,将类别中的名称转化为数字,当然也可以通过sklearn中的labelencode来实现
def parseRecord2(record):
    if record == 'Iris-setosa':
        return  1
    elif record == 'Iris-versicolor':
        return 2
    elif record == 'Iris-virginica':
        return 3
    else:
        return np.nan

df = df.dropna(how='any')
X = df[names[0:-1]]
Y = df[names[-1]]
print(X.head())
print(Y.head())
Y = Y.apply(parseRecord2)

## 数据抽样(训练数据和测试数据分割)
X_train,X_test,Y_train,Y_test = train_test_split(X, Y, test_size=0.4, random_state=0)
### 2. 数据标准化
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)

##### KNN算法实现
# a. 模型构建
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, Y_train)

# 模型效果输出
## 将正确的数据转换为矩阵形式
print(Y_test.head(),Y_test.shape,type(Y_test))
y_test_hot = label_binarize(Y_test,classes=(1,2,3))#将数值为1,2,3的y_test转换为0-1矩阵
print(y_test_hot[0:5])
## 得到预测的损失值
knn_y_score = knn.predict_proba(X_test)
## 计算roc的值
knn_fpr, knn_tpr, knn_threasholds = metrics.roc_curve(y_test_hot.ravel(),knn_y_score.ravel())
## 计算auc的值
knn_auc = metrics.auc(knn_fpr, knn_tpr)
print ("KNN算法R值:", knn.score(X_train, Y_train))
print ("KNN算法AUC值:", knn_auc)

# c. 模型预测
knn_y_predict = knn.predict(X_test)
发布了23 篇原创文章 · 获赞 6 · 访问量 4676

猜你喜欢

转载自blog.csdn.net/qq_34211618/article/details/103840409
今日推荐