1.準備預測模型
? 機器學習的特征
? 什么是模型斟冕?
? 如何對模型進行評估磕蛇?
? 工具:
第一個模型:k近鄰(k-Nearest Neighbor)模型
第一個R包:caret
什么是“機器學習”(machine learning)伏伯?
機器學習:掌握一些算法说搅,通過訓練數(shù)據(jù)輸入獲得模型弄唧,利用模型學習新的數(shù)據(jù),獲得對預測性能的改善澄干。1.1模型
模型:定量地或定性地描述系統(tǒng)各變量之間的相互關(guān)系或因果關(guān)系的一系列數(shù)學方程麸俘。
模型獲得的特征一
? 根據(jù)數(shù)據(jù)來構(gòu)建和選擇模型
? 不以數(shù)學推理或邏輯歸納的手段從已知事實獲得模型
例如:預測降雨量,收集有限地點的歷史降雨量數(shù)據(jù)(降雨量拜效,及高度紧憾、經(jīng)度父阻、緯度),來預測沒有收集或者無法收集任何數(shù)據(jù)的地點的降雨量煤篙。
1.1.1 從數(shù)據(jù)中學習
模型獲得的特征二
? 根據(jù)模型數(shù)據(jù)創(chuàng)建模型來描述現(xiàn)象的過程中,必然存在某些隨機性的來源
模型包含:隨機成分+確定成分
Iris Data Set(鳶尾屬植物數(shù)據(jù)集)
數(shù)據(jù)集合包含三種鳶尾屬植物[setosa,versicolor, virginica]鸠窗。
每一種植物有50株植物稍计,包含長度和寬度的數(shù)據(jù)(cm),共150株植物的數(shù)據(jù)[sepal:萼片硅则;petal:花瓣]怎虫。
head(iris)
令?? = { ??1 , ??2, ? , ????} 表示包含 ?? 個示例的數(shù)據(jù)集,每個示例由 ?? 個屬性描述, 則每個示例 ???? = (????1, ????2, ? , ??????) 是 d維樣本空間??中的一個向量饥努,???? ∈ ??酷愧,其中??????是示例????在第??個屬性上的取值乍迄,?? 稱為樣本 ????的“維數(shù)”(dimensionality)闯两。
library(ggplot2)
ggplot(iris, aes(Petal.Length)) + geom_histogram(bins = 30)
# bins指定分組數(shù)目(格子),默認值是30逊躁,如果未設(shè)置稽煤,將顯示警告消息。
ggplot(iris, aes(Petal.Length, Petal.Width, color=Species)) +
geom_point() + theme(legend.position = "bottom")
# 圖例顯示在底部
預測建模的過程
創(chuàng)建一個函數(shù)來預測數(shù)量值,并使它產(chǎn)生的相對目標函數(shù)的誤差最小化假勿。
為什么我們總是很難找到目標函數(shù)?
? 可簡化誤差(reducible error):實際模型是非線性的用線性模型
? 不可簡化誤差(irreducible error):噪聲,或者由于數(shù)據(jù)集合太小
1.1.2 模型的核心組成部分
● 帶有需要調(diào)優(yōu)參數(shù)的一組方程:線性回歸浸须、神經(jīng)網(wǎng)絡(luò)、支持向量機等有特定的參數(shù)化方程
● 代表我們建模所針對系統(tǒng)或過程的一些數(shù)據(jù)
● 描述該模型擬合優(yōu)度的一個概念
● 更新參數(shù)以改善模型擬合優(yōu)度的一種方法
kNN模型
K-nearest Neighbor
如果一個樣本在特征空間中的K個最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個類別肌索,則該樣本也屬于這個類別诚亚。該方法在定類決策上只依據(jù)最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別闸准。
? 給定??后先估計??的條件分布,然后將一個給定的觀測分類到估計分布概率最大的類別中
KNN與K-means的區(qū)別:
KNN屬于監(jiān)督學習,類別是已知的缺谴,通過對已知分類的數(shù)據(jù)進行訓練和學習,找到這些不同類的特征,再對未分類的數(shù)據(jù)進行分類。
K-means屬于非監(jiān)督學習戈咳,事先不知道數(shù)據(jù)會分為幾類泌枪,通過聚類分析將數(shù)據(jù)聚合成幾個群體碌燕。聚類不需要對數(shù)據(jù)進行訓練和學習。
用kNN模型來預測該花屬于哪個品種慈鸠?
第一步:確定新樣本的k個最鄰近樣本第二步:找到新樣本到iris數(shù)據(jù)集里每個點的距離譬巫,然后對結(jié)果排序
apply()函數(shù)只能用于處理矩陣類型的數(shù)據(jù)缕题。
apply()一般有三個參數(shù):
第一個參數(shù)代表矩陣對象;
第二個參數(shù)代表要操作矩陣的維度锨阿,1表示對行進行處理,2表示對列進行處理末早;
第三個參數(shù)是處理數(shù)據(jù)的函數(shù)。apply會分別一行或一列處理該矩陣的數(shù)據(jù)姿搜。
# 新建一個樣本
new_sample <- c(4.8, 2.9, 3.7, 1.7)
names(new_sample)<-c("Sepal.Length","Sepal.Width","Petal.Length","Petal.Width")
# 去掉標簽列舅柜,只保留特征列
iris_features <- iris[1:4] # 另一種寫法iris[-5]
# 構(gòu)建一個函數(shù),樣本和鄰居的點距
dist_eucl <- function(x1, x2) sqrt(sum((x1 - x2) ^ 2))
# 計算new_sample到iris_features150個樣本的距離
distances <- apply(iris_features,1,function(x) dist_eucl(x,new_sample))
# 對計算后的距離排序
# index.return = T把計算的距離和數(shù)據(jù)框的行號對應起來
distances_sorted <- sort(distances,index.return = T)
str(distances_sorted)
# 選取距離最近的前5個點
nn_5 <- iris[distances_sorted$ix[1:5],]
# ix包含了對應觀測數(shù)據(jù)的行號
5個最鄰近的新樣本中有4個屬于versicolor品種太伊,1個是virginica品種僚焦。通常采用投票作為篩選類別的預測立肘。因此茧痒,認為測試樣本點屬于versicolor旺订。
注:通常k取奇數(shù)個,方便投票樱调。
1.2 模型的類別
有監(jiān)督學習( supervised learning )
? Iris數(shù)據(jù)集,4個特征和1個輸出量
? 對輸入點的預測是通過組合該點的一小批鄰近點的輸出變量值來進行的
無監(jiān)督學習(unsupervised learning)
? 若iris數(shù)據(jù)集的無監(jiān)督版本只包含4個特征菩颖,沒有品種的輸出變量
? 查看數(shù)據(jù)并根據(jù)他們之間的相似度對觀測數(shù)據(jù)進行分組
? 進行聚類(clustering)然后進行預測
半監(jiān)督學習(semi-superivsed)
? 利用一部分包含輸出量值而其他部分完全無標簽的數(shù)據(jù)來粗略地訓練模型放祟,然后引入無標簽數(shù)據(jù)跪妥,用訓練的模型對其產(chǎn)生預測的標簽
強化學習(reinforcement learning)
? 無法獲得輸出變量侦香,但提供了其他和輸出變量直接相關(guān)的信息根據(jù)棋譜,對贏得象棋比賽的下一步的走法進行預測
監(jiān)督學習vs無監(jiān)督學習
監(jiān)督學習:輸入{????, ????}散吵,學習?? = ??(??; ??)
分類: ??是可分類的矾睦,例如:主題
回歸: ??是連續(xù)的缓溅,例如:溫度坛怪,收入
排序: ??是順序的
結(jié)構(gòu)預測:y是關(guān)于x的臨時結(jié)構(gòu)
無監(jiān)督學習:輸入{????},學習?? = ??(??; ??)
概率密度估計: ??是概率密度沉帮,?? = ??(??; ??)
異常監(jiān)測: ??是異常的
2. 預測建模的過程
定義模型的目標
收集數(shù)據(jù)
選取模型
數(shù)據(jù)預處理
特征工程和降維
訓練和評估模型
重復嘗試不同模型及模型的最終選擇
部署模型
2.1數(shù)據(jù)預處理
?探索性數(shù)據(jù)預處理
R函數(shù)中的穆壕,summary
圖形可視化,ggplot2
psych包中其屏,describe()函數(shù)
?特征工程和降維
數(shù)值特征是完全互不相同的進位制來衡量的
輸入特征進行變換(比例放縮)
2.1.1歸一化和標準化
Caret包(Classification And REgression Training)
利用caret包的兩步:
?preProcess()函數(shù):預處理的變換喇勋,訓練數(shù)據(jù)集中
?predict()函數(shù):
-
函數(shù)形式
predict(object, newdata = NULL,
type = c("link", "response", "terms"),
se.fit = FALSE, dispersion = NULL, terms = NULL,na.action = na.pass, ...) -
參數(shù)介紹
object: 是一個從glm繼承的模型對象
newdata: 是一個數(shù)據(jù)框,如果缺失就用訓練數(shù)據(jù)進行預測偎行,也即擬合值
type: 表示預測種類川背。默認是歸一化的線性預測蛤袒;responses是歸一化的響應變量熄云。因此對于一個二分類模型,默認是log-odds (logit歸一化的概率)妙真,然而type="response"給出的是預測概率缴允。“terms”返回一個矩陣提供在線性預測下模型公式中每一項的擬合值珍德。
se.fit: 是一個bool值练般,表示標準誤差是否需要。
dispersion: GLM中用于計算標準化誤差的離差锈候。如果缺失薄料,將會返回模型對象中的summary.
terms: with type = "terms" by default all terms are returned. A character vector specifies which terms are to be returned.
na.action: 表示如何對待newdata中的缺失數(shù)據(jù),默認是將缺失值預測為NA.
library("caret")
# 去掉標簽列晴及,只保留特征列
iris_numeric <- iris[1:4]
# 區(qū)間歸一化
pp_unit <- preProcess(iris_numeric, method =c("range"))
iris_numeric_unit <- predict(pp_unit, iris_numeric)
# Z評分歸一化
pp_zscore <- preProcess(iris_numeric,method=c("center","scale"))
iris_numeric_zscore <- predict(pp_zscore,iris_numeric)
# boxcox變換
pp_boxcox <- preProcess(iris_numeric,method=c("BoxCox"))
iris_numeric_boxcox <- predict(pp_boxcox,iris_numeric)
# 畫圖
# 歸一化之前
ggplot(iris_numeric, aes(x=Sepal.Length)) +
geom_density(color="black",fill="black",alpha=0.4)+
ggtitle("Unnormalized")
# 區(qū)間歸一化
ggplot(iris_numeric_unit, aes(x=Sepal.Length)) +
geom_density(color="black",fill="black",alpha= 0.4)+
ggtitle("Unit Interval Transformation")
# Z評分歸一化
ggplot(iris_numeric_zscore, aes(x=Sepal.Length)) +
geom_density(color="black",fill="black",alpha= 0.4)+
ggtitle("Z-Score Transformation")
# bocox變換
ggplot(iris_numeric_boxcox, aes(x=Sepal.Length)) +
geom_density(color="black",fill="black",alpha= 0.4)+
ggtitle("Box Cox Transformation")
2.1.2尋找強相關(guān)性
?caret包提供了findCorrelation()函數(shù)都办,可以把一個相關(guān)系數(shù)矩陣作為輸入嫡锌,還可以設(shè)定相關(guān)系數(shù)的絕對值指定一個閾值的cutoff參數(shù)。
?它會返回一個(有可能長度為0)的向量琳钉。該向量會顯示由于相關(guān)性需要從數(shù)據(jù)框中刪除的列势木,cutoff的默認值是0.9。
# 查看各特征屬性間的相關(guān)系數(shù)歌懒,并將相關(guān)系數(shù)賦iris_cor變量
cor(iris_numeric)
可見啦桌,Petal.Width和Petal.Length的相關(guān)系數(shù)高達0.96。
iris_cor <- cor(iris_numeric)
findCorrelation(iris_cor)
findCorrelation(iris_cor,cutoff=0.99)
findCorrelation(iris_cor,cutoff=0.80)
由于findCorrelation默認是找到相關(guān)系數(shù)大于90%的特征及皂,可以看到甫男,返回結(jié)果為3,代表Petal.Length 與其他變量存在較強相關(guān)性验烧,可以被刪除板驳。
如果設(shè)置cutoff=0.99,結(jié)論是0碍拆,找不到需要剔除的變量若治;如果設(shè)置cutoff=0.8,將發(fā)現(xiàn)要剔除的變量有兩個感混。
2.1.3尋找共線性
兩個變量強相關(guān)端幼,并不能說明他們一定具有共線性。如要發(fā)現(xiàn)變量間的共線性弧满,可以使用findLinearCombos函數(shù)婆跑。
#構(gòu)造一個新的數(shù)據(jù)框,人為增加兩列庭呜。
#Cmb是Sepal.Length和Petal.Width的線性表示滑进,Cmb.N是在Cmb上再加一個隨機數(shù)
new_iris <- iris_numeric
new_iris$Cmb <- 6.7*new_iris$Sepal.Length - 0.9*new_iris$Petal.Width
set.seed(68)
new_iris$Cmb.N <- new_iris$Cmb + rnorm(nrow(new_iris),sd=0.1)
options(digits = 4) #為了顯示方便,只顯示四位數(shù)
head(new_iris, n = 3)
Cmb是Sepal.Length和Petal.Width特征的完全線性組合募谎,Cmb.N和Cmb相同郊供,但是加上了某些均值為0,且標準差很薪础(0.1)的高斯噪聲的特征。
利用findLinearCombos()函數(shù)鲫寄,可以檢測出嚴格的特征線性組合吉执,不過有噪聲就檢測不到了。
# 使用findLinearCombos函數(shù)來查找共線性
findLinearCombos(new_iris)
可以看到地来,建議刪除第5個特征(Cmb)戳玫,因為它是1和4的線性組合。
2.1.4尋找零方差變量
零方差變量就是值為一個常數(shù)的變量未斑,所有觀測數(shù)據(jù)在該特征屬性上都是一個常數(shù)咕宿,或者絕大部份都是一個常數(shù),導致數(shù)據(jù)在抽樣過程中沒有變化。這樣的數(shù)據(jù)會影響模型的準確性府阀。
在R中缆镣,使用nearZeroVar函數(shù)來檢測零方差變量或則近似零方差變量。
# 構(gòu)造一個新的數(shù)據(jù)框试浙,人為增加兩列董瞻。
# ZV列是一個常數(shù)6.5(零方差變量)
# Yellow除了第一行是True,其他都是False田巴,所以是一個近似零方差變量
newer_iris <- iris_numeric
newer_iris$ZV <- 6.5
newer_iris$Yellow <- ifelse(rownames(newer_iris)==1,T,F)
nearZeroVar(newer_iris)
nearZeroVar(newer_iris, saveMetrics=T)
freqRatio頻數(shù)比率钠糊,percentUnique 唯一值比率,zeroVar表示零方差變量壹哺,nzv表示近似零方差變量抄伍。
2.1.5特征降維——PCA
R語言有非常多的途徑做主成分分析,比如自帶的princomp()和prcomp()函數(shù)管宵,還有psych包的principal()函數(shù)截珍、gmodels包的fast.prcomp函數(shù)、FactoMineR包的PCA()函數(shù)啄糙、ade4包的dudi.pca()函數(shù)笛臣、amap包的acp()函數(shù)等。
主成分分析法(principal component analysis)
?主成分分析經(jīng)常用減少數(shù)據(jù)集的維數(shù)隧饼,同時保持數(shù)據(jù)集的對方差貢獻最大的特征
?原理:
設(shè)法將原來變量重新組合成一組新的相互無關(guān)的幾個綜合變量沈堡,同時根據(jù)實際需要從中可以取出幾個較少的綜合變量盡可能多地反映原來變量的信息的統(tǒng)計方法,也是處理降維的一種方法燕雁。
?選取前兩個主成分或其中某兩個主成分诞丽,由圖形可直觀地看出各個輸入在主分量中的地位。
# thresh表示PCA的累積方差比達到95%
pp_pca <- preProcess(iris_numeric, method=c("BoxCox", "center", "scale", "pca"), thresh=0.95)
iris_numeric_pca <- predict(pp_pca, iris_numeric)
#保留兩位數(shù)字
options(digits=2)
# 使用pp_pca$rotation來查看變量的有效載荷(權(quán)值),或特征向量拐格、回歸系數(shù)
pp_pca$rotation
Iris花的數(shù)值特征的前兩個主成分就包含了數(shù)據(jù)集里面95%的變異僧免。
主成分權(quán)值,也就是說:
PC1=??. ???? ? Se??????. ???????????? ? ??. ???? ? ??????????.?????????? + ??. ???? ? ??????????. ???????????? + ??. ???? ? ??????????. ????????
pp_pca_full <- preProcess(iris_numeric, method=c( "BoxCox", "center", "scale","pca"),pcaComp=4)
# pcaComp=4捏浊,用4個PCA維度
iris_pca_full <- predict(pp_pca_full, iris_numeric)
#150行數(shù)據(jù)形成PCA下的新坐標
head(iris_pca_full,3)
Iris花的數(shù)值特征的前兩個主成分就包含了數(shù)據(jù)集里面95%的變異:
第一個PCA是一條擬合原始數(shù)據(jù)最近似的直線
第二個PCA是擬合第一條直線擬合原始數(shù)據(jù)的誤差
第三個PCA是擬合第一個和第二個PCA擬合后剩下的誤差
#計算PC1懂衩、PC2、PC3金踪、PC4 四個維度下的方差
pp_pca_var <- apply(iris_pca_full,2,var)
pp_pca_var
#計算每一列的百分占比浊洞;計算每一列的累計百分占比
iris_pca_var <- data.frame(Variance = round(100*pp_pca_var/sum(pp_pca_var),2), CumulativeVariance = round(100*cumsum(pp_pca_var) / sum(pp_pca_var),2))
iris_pca_var
計算得出來PC1新坐標的占比是73%,PC1和PC2占比96%胡岔。也就是PC1和pC2兩個新的維度可以解釋原數(shù)據(jù)96%法希。
# 畫主成分的陡坡圖
p <- ggplot(data=iris_pca_var)
p <- p + aes(x=rownames(iris_pca_var), y=Variance, group=1) #x軸是PC1-PC4
p <- p + geom_line() #連線
p <- p + geom_point() #點描出來
p <- p + xlab("Principal Component") #橫坐標是PC1-PC4
p <- p + ylab ("Percentage of Original Variance Captured") #縱坐標是PC1-PC4對應方差
p <- p + ggtitle("Scree Plot for Iris PCA")
p <- p + geom_text(aes(label = paste(Variance, "% (", CumulativeVariance, "%)", sep = ""), parse = F),hjust=0, vjust=-0.5)
2.2訓練模型
訓練集(training set)和測試集(test set)
?通常測試集占15%~30%
?如果數(shù)據(jù)較少劃分為85%/15%
?如果數(shù)據(jù)較多劃分為70%/30%
過擬合(overfitting)
?在訓練集中表現(xiàn)良好,但是在測試集表現(xiàn)較差
?對觀測數(shù)據(jù)擬合得過于嚴密靶瘸,無法對未知數(shù)據(jù)廣義化
?換言之苫亦,該模型在訓練數(shù)據(jù)集中提取了不真實的細節(jié)和變異毛肋,而這些細節(jié)和變異不具有代表性
偏誤-方差權(quán)衡(bias-variance tradeoff)
?訓練和測試數(shù)據(jù)性能不一致的來源還包括模型偏誤和方差
?統(tǒng)計模型的方差:如果使用另一個訓練集,模型預測出來的函數(shù)會有多大的變化屋剑。我們希望方差越小越好润匙。
其中,caret包中用 createDataPartition()函數(shù) 創(chuàng)建抽樣向量饼丘。
在非監(jiān)督學習中,使用的是sample函數(shù)來進行隨機抽樣趁桃。
sample(x, size, replace = FALSE, prob = NULL)
x表示要抽樣的向量,size表示要抽樣的次數(shù)肄鸽,replace代表是否是放回抽樣卫病,默認是不放回抽樣。prob也是一個向量典徘,用于標示待抽樣向量中每個元素的權(quán)重蟀苛。
# 隨機抽樣,該函數(shù)將會隨機抽取80%的數(shù)據(jù)逮诲。list=false表示返回是一個矩陣而不是列表帜平。
set.seed(2412)
# 按照種類進行索引,提取80%作為訓練集
iris_sampling_vector <- createDataPartition(iris$Species, p = 0.8, list = FALSE)
iris_sampling_vector
# 獲取訓練集數(shù)據(jù)
iris_train <- iris_numeric[iris_sampling_vector,]
iris_train_z <- iris_numeric_zscore[iris_sampling_vector,] # Z評分歸一化梅鹦,選取80%訓練集
iris_train_pca <- iris_numeric_pca[iris_sampling_vector,] # PCA降維后裆甩,選取80%作為訓練集
iris_train_labels <- iris$Species[iris_sampling_vector]
# 獲取測試集數(shù)據(jù),去掉訓練集所在的行
iris_test <- iris_numeric[-iris_sampling_vector,] #iris_test_z <- iris_numeric_zscore[-iris_sampling_vector,] # Z評分歸一化后測試集
iris_test_pca <- iris_numeric_pca[-iris_sampling_vector,] # PCA降維后測試集
iris_test_labels <- iris$Species[-iris_sampling_vector]
# 找5個鄰居模式下,用原始數(shù)據(jù)集iris_train訓練得到knn_model
knn_model <- knn3(iris_train, iris_train_labels, k = 5)
# 找5個鄰居模式下齐唆,用Z評分歸一化數(shù)據(jù)集iris_train_z訓練得到knn_model
knn_model_z <- knn3(iris_train_z, iris_train_labels, k = 5)
# 找5個鄰居模式下嗤栓,用PCA降維數(shù)據(jù)集iris_train_pca訓練得到knn_model
knn_model_pca <- knn3(iris_train_pca, iris_train_labels, k = 5)
# 畫圖
library(class)
require(class)
layout(matrix(1:4,2,2, byrow=T)) #4個圖,2行2列顯示
for (k in c(1,5,10,15)) {
x <- iris_train_pca
px1 <- seq(from=-3.5, to=3.5, by=0.1)
px2 <- seq(from=-3.5, to=3.5, by=0.1)
g <- iris_train_labels
xnew <- as.matrix(expand.grid(px1, px2))
mod15 <- knn(x, xnew, g, k=k, prob=F)
prob <- ifelse(mod15=="setosa", 1.0, ifelse(mod15=="virginica", 0.6, 0.1))
prob15 <- matrix(prob, length(px1), length(px2))
par(mar=rep(2,4))
contour(px1, px2, prob15, levels=c(0.2), labels="", xlab="", ylab="", main=paste(k,"NN on Iris PCA",sep=""), axes=FALSE)
train_pch <- ifelse(g=="setosa", 15, ifelse(g=="virginica", 16, 17))
grid_pch <- ifelse(mod15=="setosa", 15, ifelse(mod15=="virginica", 16 , 17))
points(x, pch=train_pch, cex=1.2, col="gray40")
gd <- expand.grid(x=px1, y=px2)
points(gd, pch=".", cex=0.4)
box()
}
2.3評估模型
卡巴統(tǒng)計量是被設(shè)計用來抵消隨機因素的箍邮,它的取值空間為[-1, 1]茉帅,其中1代表完全精確,-1代表完全不精確锭弊,而0是在精確度恰好等于隨機猜測法的結(jié)果時出現(xiàn)的堪澎。
它主要用于一致性檢驗,用來度量兩個被觀測對象的一致程度味滞。
在R中樱蛤,使用caret包中的postResample函數(shù)來計算準確率和卡巴系數(shù)。
knn_predictions <- predict(knn_model, iris_test, type = "class")
postResample(knn_predictions, iris_test_labels)
# 還可以使用table來顯示混淆矩陣(交叉列聯(lián)表)
table(knn_predictions,iris_test_labels)
評估二元分類問題
第一類錯誤(Type I error):假陽性
第二類錯誤(Type II error):假陰性
在R中剑鞍,其實可以使用caret包的knn3函數(shù)來方便的進行分類預測刹悴。下面是完整代碼:
#剔除標簽項,保留特征列
iris_numeric <- iris[1:4]
#數(shù)據(jù)預處理攒暇,區(qū)間歸一化
pp_unit <- preProcess(iris_numeric, method = c("range"))
iris_numeric_unit <- predict(pp_unit, iris_numeric)
#隨機抽樣。劃分訓練集和測試集
iris_sampling_vector <- createDataPartition(iris$Species, p = 0.8, list = FALSE)
#獲取訓練集數(shù)據(jù)
iris_train <- iris_numeric_unit[iris_sampling_vector,]
#獲取訓練集分類數(shù)據(jù)
iris_train_labels <- iris$Species[iris_sampling_vector]
#獲取測試集數(shù)據(jù)
iris_test <- iris_numeric_unit[-iris_sampling_vector,]
#獲得測試集分類數(shù)據(jù)
iris_test_labels <- iris$Species[-iris_sampling_vector]
#訓練模型
knn_model <- knn3(iris_train, iris_train_labels, k=5)
#根據(jù)模型對測試集進行預測子房,評分類型為分類或者投票
knn_predictions <- predict(knn_model, iris_test, type = "class")
#計算準確率
postResample(knn_predictions, iris_test_labels)
#顯示混淆矩陣
table(knn_predictions,iris_test_labels)