1 数据
以R中自带的鸢尾花数据集为例,根据花瓣、萼片的长宽来预测植物类别!
> data(iris)
> iris
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
说明:iris是R自带的数据,Species是鸢尾花的种类,Sepal.Length Sepal.Width Petal.Length Petal.Width分别是萼片、花瓣的长和宽。
2 划分训练集和测试集
> dim(iris)
[1] 150 5
> n=dim(iris)[1]
> sp=sample(1:n,size=round(n*0.3),replace=FALSE) # 随机抽取30%的数据
> iris_train=iris[-sp,] # 70%作为训练集
> iris_test=iris[sp,] # 30%作为测试集
3 采用KNN模型进行分类
训练模型:
> install.packages("kknn")
> library(kknn)
> fit_kknn=kknn(Species~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width,iris_train,iris_test,distance=1,kernel = "triangular")
说明:distance=1来设置Minkowski的参数,kernel用于指定加权的类型,"rectangular" 表示不加权,除此之外,还有 "triangular", "epanechnikov" , "biweight" , "triweight", "cos", "inv", "gaussian", "rank" and "optimal"等选项。
> summary(fit_kknn)
Call:
kknn(formula = Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, train = iris_train, test = iris_test, distance = 1, kernel = "triangular")
Response: "nominal"
fit prob.setosa prob.versicolor prob.virginica
1 versicolor 0 1.00000000 0.00000000
2 versicolor 0 1.00000000 0.00000000
3 virginica 0 0.19799013 0.80200987
4 versicolor 0 1.00000000 0.00000000
5 virginica 0 0.00000000 1.00000000
6 virginica 0 0.05256696 0.94743304
7 setosa 1 0.00000000 0.00000000
8 setosa 1 0.00000000 0.00000000
说明:summary()函数给出模型的摘要信息,这里显示全部结果。
预测:
> sum(fit_kknn$fitted.values==iris_test$Species)/dim(iris_test)[1]
[1] 0.9111111
说明:分类的正确率为0.9111111
> table(iris_test$Species,fit_kknn$fitted.values)
setosa versicolor virginica
setosa 15 0 0
versicolor 0 13 0
virginica 0 4 13
说明:三个类别中,setosa的15个测试样本全部分类正确,versicolor的13个测试样本全部分类正确,virginica的17个测试样本13个分类正确,4个分类错误。