KNN模型

Reads: 957 Edit

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个分类错误。


Comments

Make a comment