安德森鸢尾花卉数据集

安德森鸢尾花卉数据集(Anderson’s Iris data set)或费雪鸢尾花卉数据集(Fisher’s Iris data set)是一类多重变量分析的数据集。

其数据集包含了150个样本,鸢尾属下的三个亚属:

  1. 山鸢尾(setosa);
  2. 变色鸢尾(versicolor);
  3. 维吉尼亚鸢尾(virginica)。

四个特征被用作样本的定量分析:

  1. 花萼长度(sepal length);
  2. 花萼宽度(sepal width);
  3. 花瓣长度(petal length);
  4. 花瓣宽度(petal width)。

利用此数据学习 R 语言和 KNN 算法(K-近邻算法)和决策树。

KNN 是一种用于分类和回归的非参数统计方法,是 ML 中最简单的算法之一。在 KNN 中,一个对象的分类是由其邻居的“多数表决”确定的,k 个最近邻居中最常见的分类决定了赋予该对象的类别。若 k = 1,则该对象的类别直接由最近的一个节点赋予。

数据读取:

#!/usr/bin/env Rscript
###
# iris
#
# @author YanWen <i@yanwen.email>
###

# x: vector
normalize <- function(x) { (x - min(x)) / (max(x) - min(x)) }

iris <- read.csv('iris.csv')
train.num <- 130

# Disorder
set.seed(2345)
gp <- runif(nrow(iris))
iris <- iris[order(gp), ]

iris.n <- as.data.frame(lapply(iris[, -5], normalize))
iris.train <- iris.n[1:train.num, ]
iris.test <- iris.n[(train.num + 1):150, ]

iris.train.target <- iris[1:train.num, 5]
iris.test.target <- iris[(train.num + 1):150, 5]

iris.train.total <- iris[1:train.num, ]
iris.test.total <- iris[(train.num + 1):150, ]

150 个数据,乱序后选择前 130 个数据为训练数据,后 20 个作为测试数据,测试结果不在对角线上的为预测失败值。

KNN 算法:

# No.1 KNN
library('class')

# Knn(k: number of neighbours considered.)
m1 <- knn(train=iris.train, test=iris.test, cl=iris.train.target, k=15)
print(table(iris.test.target, knn=m1))
# Result:
#                 knn
# iris.test.target i.setosa i.versicolor i.virginica
#     i.setosa            4            0           0
#     i.versicolor        0            6           0
#     i.virginica         0            1           9

C5.0 Decision Tree 算法:

# No.2 Decision Tree - C5.0
library('C50')

m2 <- C5.0(iris.train, iris.train.target)   # summary(m2) get more info
p2 <- predict(m2, iris.test)
print(table(iris.test.target, C5.0=p2))
# Result
#                 C5.0
# iris.test.target i.setosa i.versicolor i.virginica
#     i.setosa            4            0           0
#     i.versicolor        0            6           0
#     i.virginica         0            1           9

# Plot the decision tree
plot(m2)

Decision Tree:

 


其中 sepal_*、petal_* 做了一定的归一化处理,进行了缩放,不是原来的值。

Rpart Decision Tree 算法:

# No.3 Decision Tree - rpart
library('rpart')
library('rpart.plot')

m3 <- rpart(species ~ ., data=iris.train.total, method='class')   # summary(m3) get more info
p3 <- predict(m3, iris.test.total, type='class')
print(table(iris.test.target, rpart=p3))
# Result
#                 rpart
# iris.test.target i.setosa i.versicolor i.virginica
#     i.setosa            4            0           0
#     i.versicolor        0            6           0
#     i.virginica         0            1           9

# Plot the decision tree
rpart.plot(m3, type=3, extra=101, fallen.leaves=T)

Decision Tree:


参考:

  1. IBM – 决策树算法介绍及应用
  2. https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm
  3. https://en.wikipedia.org/wiki/Iris_flower_data_set
  4. https://archive.ics.uci.edu/ml/datasets/Iris

作者: V

Web Dev

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s