监督学习-KNN最邻近分类算法

分类(Classification)指的是从数据中选出已经分好类的训练集,在该训练集上运用数据挖掘分类的技术建立分类模型,从而对没有分类的数据进行分类的分析方法。

分类问题的应用场景:用于将事物打上一个标签,通常结果为离散值。例如判断一副图片上的动物是一只猫还是一只狗,分类通常是建立在回归之上。

基本的分类方法—KNN最邻近分类算法,简称KNN,最简单的机器学习算法之一。

核心逻辑:在距离空间里,如果一个样本的最接近的K个邻居里,绝大多数属于某个类别,则该样本也属于这个类别。

 

 

给定电影分类样例,预测某一电影的分类。

from sklearn import neighbors  #导入模块
import warnings
warnings.filterwarnings('ignore') #不发出警告

df = pd.DataFrame({'name':['北京遇上西雅图','喜欢你','疯狂动物城','战狼2','力王','敢死队'],
                  'fight':[3,2,1,101,99,98],
                  'kiss':[104,100,81,10,5,2],
                  'type':['love','love','love','action','action','action']})
love = df[df['type']] == 'love']
action = df[df['type']== 'action']
plt.scatter(love['fight'],love['kiss'],color = 'red',label = 'love')  # 类型为爱情的电影做红色散点图
plt.scatter(action['fight'],action['kiss'],color = 'green',label='action')  # 类型为动作片的电影做绿色散点图
plt.legend()

knn = neighbors.KNeighborsClassifier()  # 创建KNN最邻近分类模型
knn.fit(df[['fight','kiss']],df['type'])  # 给模型导入数据

k = knn.predict([[18, 90]])  # 预测数据,参数需要是二维的
print('预测电影类型为%s'%k,type(k))  # 预测电影类型为['love'],<class 'numpy.ndarray'>
plt.scatter(18,90,color = 'blue',marker='x',label=k) 
plt.text(18,90,'《你的名字》',color='blue') 

 

另外随机生成一组数据,用上面的knn分类模型进行分类

df2 = pd.DataFrame(np.random.rand(100,2)*80,columns=['fight','kiss'])
df2['predictType'] = knn.predict(df2)

plt.scatter(love['fight'],love['kiss'],color = 'red',label = 'love')  
plt.scatter(action['fight'],action['kiss'],color = 'green',label='action')
plt.legend()

plt.scatter(df2[df2['predictType']=='love']['fight'],df2[df2['predictType']=='love']['kiss'],color = 'red',label = 'love',marker='x')  
plt.scatter(df2[df2['predictType']=='action']['fight'],df2[df2['predictType']=='action']['kiss'],color = 'green',label='action',marker='x')

df2.head()

     

 

案例2:植物分类

from sklearn import datasets
iris = datasets.load_iris()
print(iris.data[:5])  #类型为<class 'sklearn.utils.Bunch'>,数据部分为一个二维数组
print(iris.feature_names)
print(iris.target_names) 
# print(iris.target) #表示每一个数据所属的分类,分类用数字表示,结果为数组

# [[5.1 3.5 1.4 0.2]
#  [4.9 3.  1.4 0.2]
#  [4.7 3.2 1.3 0.2]
#  [4.6 3.1 1.5 0.2]
#  [5.  3.6 1.4 0.2]]
#['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)'],表示分类特征:萼片长度、萼片宽度、花瓣长度、花瓣宽度
#['setosa' 'versicolor' 'virginica'],表示分类名称

 

构建DataFrame方便查看数据,并使用数字分类和名称分类分别构建模型

data = pd.DataFrame(iris.data, columns = iris.feature_names)  #构建DataFrame方便查看
data['target'] = iris.target
print(data.head())
print('----------------------------')

d = pd.DataFrame({'target':[0, 1, 2],'target_names':iris.target_names})
print(d.head())
print('----------------------------')

data = pd.merge(data,d,on='target')  #最终形成的DataFrame包含四个分类特征、分类数值、分裂名称
print(data.head())
print('----------------------------')

knn1 = neighbors.KNeighborsClassifier()  
knn1.fit(iris.data,iris.target)  #使用分类数值构建模型
t1 = knn1.predict([[0.1,0.2,0.3,0.4]])
print('所在分类(数字表示)为',t1)

knn2 = neighbors.KNeighborsClassifier()
knn2.fit(iris.data,data['target_names']) #使用分类名称构建模型
t2 = knn2.predict([[0.1,0.2,0.3,0.4]])
print('所在分类(名称表示)为',t2)  
# 上述输出结果
#
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) target # 0 5.1 3.5 1.4 0.2 0 # 1 4.9 3.0 1.4 0.2 0 # 2 4.7 3.2 1.3 0.2 0 # 3 4.6 3.1 1.5 0.2 0 # 4 5.0 3.6 1.4 0.2 0 # ---------------------------- # target target_names # 0 0 setosa # 1 1 versicolor # 2 2 virginica # ---------------------------- # sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) target target_names # 0 5.1 3.5 1.4 0.2 0 setosa # 1 4.9 3.0 1.4 0.2 0 setosa # 2 4.7 3.2 1.3 0.2 0 setosa # 3 4.6 3.1 1.5 0.2 0 setosa # 4 5.0 3.6 1.4 0.2 0 setosa # ---------------------------- # 所在分类(数字表示)为 [0] # 所在分类(名称表示)为 ['setosa']

 

posted @ 2019-08-20 21:13  Forever77  阅读(600)  评论(0编辑  收藏  举报