机器学习与python实践(一)k临近(knn)

来源:互联网 发布:js数组合并函数 编辑:程序博客网 时间:2024/05/24 02:52

机器学习与python实践(一)k临近(knn)

knn算法分析
k最邻近分类算法是最简单的机器学习算法,它采用测量不同特征值之间的距离进行分类,想法很简单:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本的大多数属于某个类,则这个样本也属于这个类。
knn算法中所选择的邻近都是已经分好类的对象,该方法在定类决策上只依赖最邻近的一个或几个样本的类别来决定待分类样本的类别,不是靠判别类域的方法来确定,对于类域交叉重合较多的分类样本集这个方法更为合适。
不足之处:样本不平衡时,一个类样本容量很大,其他样本容量很小,导致输入新样本时,该样本邻近中大样本占多数,因此可以采取权值的方法(和样本距离小的邻近权值大)来改进。计算量大时另一个问题,对每个待分类的文本都要计算他到全体样本的距离,才能得出k个最邻近点。解决方法是事先对以知样本剪辑,去掉对分类作用不大的样本,适用于容量大的样本。
总的来说,我们已经存在一个带有标签的数据库,然后输入没有标签的新数据,将新数据每个特征与样本集中数据对应的特征比较,提取样本集中特征最相似的分类标签,一般只选择样本数据库中前k个最相似的数据,最后选择k个最相似数据中出现次数最多的分类。描述如下:
1)计算已知类别数据集中的点与当前点之间的距离;
2)按照距离递增次序排序;
3)选取与当前距离最小的k个点;
4)确定k个点所在类别的出现概率;
5)返回前k个点出现频率最高的类别最为当前点的预测分类。

如何选择合适的算法
考虑两个问题:一目的是什么,需要完成何种任务,是预测概率还是对对象分组;二需要分析或搜集的数据是什么。
目的:如果是预测目标变量的值,选择监督学习算法,否则选择非监督。确定选择监督算法后,如果是离散目标变量,选择分类器算法;如果是连续型数值,选择回归算法。
如果不是预测值。选择无监督。进一步分析是否需要将数据划分为离散的组,是则使用聚类算法;如还需要估计数据与每个分组的相似度,则需要使用密度估计算法。
我们需要充分了解数据,对实际数据了解的越充分,越容易创建符合实际需求的程序。主要了解数据:离散还是连续,特征值是否存在缺失,是什么原因造成缺失,是否存在异常值,某个特征发生的频率如何等等。
在选择算法需要尝试不同算法的执行结果,反复试错迭代。机器学习开发过程:
1、搜集数据2、准备输入数据3、分析输入数据4、训练算法5、测试算法6、使用算法。
k-近 邻 算 法 (knn)
它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们 只选择样本数据集中前k个最相似的数据,这就是&-近邻算法中&的出处,通常k是不大于20的整数。 最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

python实现

import pandas as pddf = pd.read_csv('.csv')#读取数据df.head()#显示前五列数据df.info()#显示数据相关变量信息df.describe()#显示各种统计数据#数据可视化import matplotlib.pyplot as pltimport seaborn as snsplt.figure()#新建图片窗口sns.countplot(x='variable', hue='target',data=df,palette='RdBu')#计量图plt.xticks([0,1],['NO','Yes'])#x 轴刻度plt.show()#显示图片#训练算法from sklearn.neighbors import KNeighborsClassifier#选择特征和目标变量y = df['target'].valuesX = df.drop('target',axis=1).values#删除目标变量列#建一个knn分类器 k=6knn = KNeighborsClassifier(n_neighbors=6)#fitknn.fit(X,y)#predicty_pred = knn.predict(X)new_prediction = knn.predict(X_nem)print('prediction:{}'.format(new_prediction))#测量训练效率#选取训练集和测试集X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42,stratify=y)#from sklearn.model_selection import train_test_splitknn.score(X_test,y_test)#取不同k值的效率图:# Setup arrays to store train and test accuraciesneighbors = np.arange(1, 9)train_accuracy = np.empty(len(neighbors))test_accuracy = np.empty(len(neighbors))# Loop over different values of kfor i, k in enumerate(neighbors):    # Setup a k-NN Classifier with k neighbors: knn    knn = KNeighborsClassifier(n_neighbors=k)    # Fit the classifier to the training data    knn.fit(X_train,y_train)    #Compute accuracy on the training set    train_accuracy[i] = knn.score(X_train, y_train)    #Compute accuracy on the testing set    test_accuracy[i] = knn.score(X_test, y_test)# Generate plotplt.title('k-NN: Varying Number of Neighbors')plt.plot(neighbors, test_accuracy, label = 'Testing Accuracy')plt.plot(neighbors, train_accuracy, label = 'Training Accuracy')plt.legend()plt.xlabel('Number of Neighbors')plt.ylabel('Accuracy')plt.show()
0 0