邻近算法
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。
训练集和测试集分割
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
from sklearn.model_selection import train_test_split
#X:所要划分的样本特征集
#y:所要划分的样本结果
#test_size:样本占比,如果是整数的话就是样本的数量
#random_state:是随机数的种子
X_train,X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)
训练和预测
from sklearn.neighbors import KNeighborsClassifier
# n_neighbors 相邻的元素个数(这些元素参与投票)
knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train,y_train)
y_predict = knn_clf.predict(X_test)
准确率
#公式:accuracy_score = sum(predict(test)) / sum (test)
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_predict)
调参和优化模型
网格搜索
网格搜索法是指定参数值的一种穷举搜索方法,通过将估计函数的参数通过交叉验证的方法进行优化来得到最优的学习算法。即将各个参数可能的取值进行排列组合,列出所有可能的组合结果生成“网格”。然后将各组合用于模型训练,并使用交叉验证对表现进行评估。在拟合函数尝试了所有的参数组合后,返回一个合适的分类器,自动调整至最佳参数组合,可以通过clf.best_estimator_获得最好的模型,通过grid_search.best_params_获得最好模型的参数,通过grid_search.best_score_获得最好的准确率。
param_grid = [
{
'weights':['uniform'],
'n_neighbors':[i for i in range(1, 11)]
},
{
'weights':['distance'],
'n_neighbors':[i for i in range(1, 11)],
'p':[i for i in range(1, 6)]
}
]
from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier()
from sklearn.model_selection import GridSearchCV
// n_jobs 并行度
// verbose 打印日志级别 越大越详细
grid_search = GridSearchCV(knn_clf,param_grid,n_jobs=-1,verbose=3)
knn_clf = grid_search.best_estimator_
knn_clf.score(X_test,y_test)
//0.9666666666666667
其他参数:https://blog.csdn.net/weixin_41988628/article/details/83098130
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV
均值方差归一化
数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。
from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
standardScaler.fit(X_train)
//StandardScaler(copy=True, with_mean=True, with_std=True)
standardScaler.transform(X_train)
standardScaler.mean_
//array([5.9025 , 3.03166667, 3.89333333, 1.26166667])
standardScaler.scale_
//array([0.81898947, 0.44290393, 1.73530657, 0.75819779])
X_train_scaler = standardScaler.transform(X_train)
X_test_scaler = standardScaler.transform(X_test)
from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train_scaler,y_train)
knn_clf.predict(X_test_scaler)
knn_clf.score(X_test_scaler,y_test)