您的位置:首页 > 编程语言 > Python开发

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

2017-05-10 09:04 288 查看
机器学习与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 pd
df = pd.read_csv('.csv')#读取数据
df.head()#显示前五列数据
df.info()#显示数据相关变量信息
df.describe()#显示各种统计数据
#数据可视化
import matplotlib.pyplot as plt
import seaborn as sns

plt.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'].values
X = df.drop('target',axis=1).values#删除目标变量列

#建一个knn分类器 k=6
knn = KNeighborsClassifier(n_neighbors=6)
#fit
knn.fit(X,y)
#predict
y_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_split
knn.score(X_test,y_test)

#取不同k值的效率图:
# Setup arrays to store train and test accuracies
neighbors = np.arange(1, 9)
train_accuracy = np.empty(len(neighbors))
test_accuracy = np.empty(len(neighbors))

# Loop over different values of k
for 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 plot
plt.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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python