iris数据集,这一教科书级别的数据,分类前不需要做任何数据预处理什么的,相当的理想!但请注意你自己的数据99%的可能需要做预处理。

下面分别用R语言和Python来实现iris数据集的分类:

R语言:

library(class)
data(iris)

#观察数据
str(iris) #查看iris数据结构
head(iris) #前5行
table(iris$Species) #样本类别频数下·

#采样(对于此分类问题,更加建议分层抽样)
samples <- sample(nrow(iris),size = round(nrow(iris)*0.8),replace = F)

iris_train <- iris[samples,]
iris_train <- iris_train[,1:4]

iris_test <- iris[-samples,]
iris_test <- iris_test[,1:4]

iris_train_labels <- iris[samples,5]
iris_test_labels <- iris[-samples,5]

iris_test_pred <- knn(train = iris_train,test = iris_test,cl = iris_train_labels,k=21)

TF <- table(iris_test_labels,iris_test_pred)
accuracy <- (sum(diag(TF))/sum(TF))
cat("正确率",accuracy)

 python语言:

# -*- coding: utf-8 -*-
'''
py3
KNeighborsClassifier(n_neighbors=5, weights='uniform',
                      algorithm='auto', leaf_size=30,
                      p=2, metric='minkowski',
                      metric_params=None, n_jobs=1, **kwargs)
n_neighbors: 默认值为5,表示查询k个最近邻的数目
algorithm:   {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’},指定用于计算最近邻的算法,auto表示试图采用最适合的算法计算最近邻
leaf_size:   传递给‘ball_tree’或‘kd_tree’的叶子大小
metric:      用于树的距离度量。默认'minkowski与P = 2(即欧氏度量)
n_jobs:      并行工作的数量,如果设为-1,则作业的数量被设置为CPU内核的数量
查看官方api:http://scikit-learn.org/dev/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier
'''

from sklearn import neighbors
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import cross_validation

iris = datasets.load_iris() #注意传入数据的数据结构和数据类型,方便比葫芦画瓢
data = iris.data
target = iris.target
#下面是随机划分训练集和测试集,分类算法更建议用分层抽样
x_train,x_test, y_train,y_test = train_test_split(data,target,test_size=0.2)
knn = neighbors.KNeighborsClassifier() #取得knn分类器
knn.fit(x_train,y_train) #导入数据进行训练

res = knn.predict(x_test)
print(res) #查看预测结果
print(iris.target_names[res]) #查看预测结果对应的标签

score = knn.score(data, target) #模型正确率
print('Accuracy:',score)

sample_data = [[ 6.5,  3. ,  5.2,  2. ],] #预测新数据,注意这是个多维数组
print(knn.predict(sample_data))
print(knn.predict_proba(sample_data)) #返回概率数组

#下面是交叉验证,判断此模型稳定性(计算平均正确率)
cross_validation.cross_val_score(
    knn,
    data,
    target,cv=5
)

参考文献:

1.《机器学习实战》
2.《机器学习与R语言》
3.《机器学习》周志华 第10章 10.1 k近邻学习
 
05-14 00:07