数据分析:分类问题和预测--KNN算法

数据类型可以有:数字,分类变量,二进制,email,微博,用户数据,json,地理位置,传感器数据等。数据定量或者定性的属性值,比如身高,体重,年龄,性别,学科成绩等。

算法简介:

  1. 分类(classification):给定一些属性标签,预测它们的一些属性。比如给定一些学生的初一初二的成绩,预测初三时的成绩。或者给定一些学生以往的成绩,预测其是否能够进入一本线等。(根据以往见过的例子,对新的数据进行预测)算法包括KNN/决策树/神经网络/支持向量机等,均属于监督学习。应用范围广泛,比如医学上的诊断(患者是否得了某种疾病)。数据分为两部分,一部分做训练集生成模型,一部分做测试集来校验模型。注意错误的代价/成本是不同的,将一个没病的人误诊为病人和将一个有病的人误诊为健康,是两种完全不同的错误。差异分析(LiftAnalysis):迅速鉴别出哪些人,更有可能是目标客户,而非撒网式的排查。
  • KNN K近邻算法

kNN(k-最近邻)方法通常用于一个更复杂分类算法的一部分。是分类数据最简单最有效的算法,是基于实例的学习,须有大量的数据集;无法给出任何数据的基础结构信息,无法知晓平均实例样本和典型实例样本具有什么特征。例如,我们可以用它的估计值做为一个对象的特征可应用于手写识别。但它无法持久化分类器(无法存储)。

KNN示例:鸢尾花分类问题。

from sklearn import datasets    #引入数据源
from sklearn.model_selection import train_test_split    #引入模型选择器,构建训练模型和测试模型
from sklearn.neighbors import KNeighborsClassifier  #引入K近邻(KNN)算法
from sklearn.model_selection import cross_val_score #引入评价函数

iris = datasets.load_iris() #获得iris数据
featureIris = iris.feature_names    #获得iris数据的特征 ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
iris_Data = iris.data  #获得ndarray类型的 iris的所有数据值(数值)
iris_Value = iris.target    #获得ndarray类型的 iris的所有分类的值(0 1 2)
iris_Name = iris.target_names   #获得iris数据分类的名称 ['setosa' 'versicolor' 'virginica']

x_train, x_test, y_train, y_test = train_test_split(iris_Data, iris_Value,test_size=0.3)
        # 由模型选择器构建,第一参数是数据,第二参数是结果,测试的比例是0.3,也就是70%训练,30%的数据用来测试
    # 训练数据 测试数据 结果训练分类值 测试分类值
knn = KNeighborsClassifier(n_neighbors=4)  # 定义knn算法器 多次测试,n_neighbor=4准确率为95-97
knn.fit(x_train, y_train)  # 将数据训练集 和 结果训练集 放入knn算法训练
result = knn.predict(x_test)  # 测试集的测试结果
print('knn分类器的测试结果:',result)

knnX = KNeighborsClassifier(n_neighbors=5)
knnX.fit(iris_Data, iris_Value)
print('knnX分类器预测这个结果:',knnX.predict([[3, 5, 4, 2]]))  # 预测这个结果
print('knn分类器预测这一组结果:',knn.predict([[3, 5, 4, 2], [5, 4, 3, 2]]))  # 预测一组结果
print('knn分类器的得分',knn.score(iris_Data,iris_Value))
scores = cross_val_score(knnX,iris_Data,iris_Value,cv=5,scoring='accuracy') #分批评价精确度 结果[0.96666667 1.         0.93333333 0.96666667 1.        ]
print('knnX分类器的分批测试精度:',scores)

Knn算法器的predict方法,可用于直接进行预测。那么我们怎么评价KnnX这种分类器好还是不好呢?可以用精确度来测试。上面部分,我们可以理解为将数据切分为5块,每块都测试精度,评价方式用准确度的方式。这种验证方式,被称为交叉验证

【练习】那么如果遇到普通的Excel表格,如何使用KNN进行预测呢?

学堂在线有一个这样的表格,要求看其他特征对性别的区分度。

数据分析:分类问题和预测--KNN算法_第1张图片

# -*- coding: utf-8 -*-
import pandas as pd
from sklearn.model_selection import train_test_split    #引入模型选择器,构建训练模型和测试模型
from sklearn.neighbors import KNeighborsClassifier  #引入K近邻(KNN)算法
from sklearn.model_selection import cross_val_score #引入评价函数

dataPath = '学堂性别.xls'
dataTestAll = pd.DataFrame(pd.read_excel(dataPath))   #读取xls文件,并转化为dataframe
dataTest = dataTestAll.drop(['编号','性别'],axis=1)
        #删除编号和性别列,因为编号在分析过程中无意义,性别是需要分析的结果列
data_Train = dataTest.values[0:,1:] #获取除了特征(属性)之外的dataframe的所有数据
data_values = dataTestAll['性别'].values[0:,] #获取身高列的全部数据

x_train, x_test, y_train, y_test = train_test_split(data_Train, data_values,test_size=0.3)
    # 由模型选择器构建,第一参数是数据,第二参数是结果,测试的比例是0.3
knn = KNeighborsClassifier(n_neighbors=8)  # 定义knn算法器 多次测试,n_neighbor=8准确率为97-98
knn.fit(x_train, y_train)  # 将数据训练集 和 结果训练集 放入knn算法训练
result = knn.predict(x_test)  # 测试集的测试结果
print('KNN得分:',knn.score(data_Train,data_values))
scores = cross_val_score(knn,data_Train,data_values,cv=5,scoring='accuracy')
print('KNN评价:',scores)
        #分5批评价精确度,评价指标是accuracy准确度 结果[0.97979798 0.96938776 0.97938144 0.96907216 0.96907216]

 

你可能感兴趣的:(Python)