機(jī)器學(xué)習(xí):K-近鄰算法(KNN):KNN算法的R語言實(shí)現(xiàn)_第1頁
機(jī)器學(xué)習(xí):K-近鄰算法(KNN):KNN算法的R語言實(shí)現(xiàn)_第2頁
機(jī)器學(xué)習(xí):K-近鄰算法(KNN):KNN算法的R語言實(shí)現(xiàn)_第3頁
機(jī)器學(xué)習(xí):K-近鄰算法(KNN):KNN算法的R語言實(shí)現(xiàn)_第4頁
機(jī)器學(xué)習(xí):K-近鄰算法(KNN):KNN算法的R語言實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

機(jī)器學(xué)習(xí):K-近鄰算法(KNN):KNN算法的R語言實(shí)現(xiàn)1機(jī)器學(xué)習(xí):K-近鄰算法(KNN):KNN算法的R語言實(shí)現(xiàn)1.1簡介1.1.1KNN算法的基本原理K-近鄰算法(K-NearestNeighbors,KNN)是一種基于實(shí)例的學(xué)習(xí)方法,它不進(jìn)行顯式的訓(xùn)練過程,而是將數(shù)據(jù)集中的所有樣本作為訓(xùn)練實(shí)例保存。當(dāng)有新的輸入數(shù)據(jù)時(shí),KNN算法會(huì)根據(jù)輸入數(shù)據(jù)在特征空間中的位置,找到距離它最近的K個(gè)訓(xùn)練實(shí)例,然后根據(jù)這K個(gè)實(shí)例的類別來預(yù)測輸入數(shù)據(jù)的類別。在分類任務(wù)中,通常采用多數(shù)表決的方式?jīng)Q定輸入數(shù)據(jù)的類別;在回歸任務(wù)中,則采用這K個(gè)實(shí)例的平均值或加權(quán)平均值作為預(yù)測值。示例代碼#加載數(shù)據(jù)集

data(iris)

iris_data<-iris[,1:4]

iris_label<-iris[,5]

#數(shù)據(jù)預(yù)處理

library(caret)

iris_data<-preProcess(iris_data,method=c("center","scale"))

iris_data<-predict(iris_data,iris[,1:4])

#劃分訓(xùn)練集和測試集

set.seed(123)

train_index<-createDataPartition(iris_label,p=0.8,list=FALSE)

train_data<-iris_data[train_index,]

test_data<-iris_data[-train_index,]

train_label<-iris_label[train_index]

test_label<-iris_label[-train_index]

#KNN分類

library(class)

knn_result<-knn(train=train_data,test=test_data,cl=train_label,k=5)

#模型評(píng)估

library(caret)

confusionMatrix(knn_result,test_label)這段代碼首先加載了iris數(shù)據(jù)集,然后進(jìn)行了數(shù)據(jù)預(yù)處理,包括中心化和標(biāo)準(zhǔn)化。接著,代碼將數(shù)據(jù)集劃分為訓(xùn)練集和測試集,使用class包中的knn函數(shù)進(jìn)行KNN分類,最后使用caret包中的confusionMatrix函數(shù)評(píng)估模型的性能。1.1.2KNN算法在分類與回歸中的應(yīng)用KNN算法可以應(yīng)用于分類和回歸任務(wù)。在分類任務(wù)中,KNN算法通過計(jì)算輸入數(shù)據(jù)與訓(xùn)練數(shù)據(jù)之間的距離,找到距離最近的K個(gè)訓(xùn)練實(shí)例,然后根據(jù)這K個(gè)實(shí)例的類別進(jìn)行多數(shù)表決,以決定輸入數(shù)據(jù)的類別。在回歸任務(wù)中,KNN算法同樣通過計(jì)算距離找到K個(gè)最近的訓(xùn)練實(shí)例,但預(yù)測值是這K個(gè)實(shí)例的平均值或加權(quán)平均值。示例代碼#加載回歸數(shù)據(jù)集

data(airquality)

airquality_data<-airquality[,c("Ozone","Solar.R","Wind","Temp")]

airquality_label<-airquality[,1]

#數(shù)據(jù)預(yù)處理

airquality_data<-preProcess(airquality_data,method=c("center","scale"))

airquality_data<-predict(airquality_data,airquality[,c("Ozone","Solar.R","Wind","Temp")])

#劃分訓(xùn)練集和測試集

set.seed(123)

train_index<-createDataPartition(airquality_label,p=0.8,list=FALSE)

train_data<-airquality_data[train_index,]

test_data<-airquality_data[-train_index,]

train_label<-airquality_label[train_index]

test_label<-airquality_label[-train_index]

#KNN回歸

library(FNN)

knn_result<-kNN(train=train_data,test=test_data,y=train_label,k=5)

#模型評(píng)估

library(caret)

RMSE(knn_result,test_label)此代碼示例展示了如何使用KNN算法進(jìn)行回歸任務(wù)。它使用了airquality數(shù)據(jù)集,預(yù)處理數(shù)據(jù)后,將數(shù)據(jù)集劃分為訓(xùn)練集和測試集。然后,使用FNN包中的kNN函數(shù)進(jìn)行KNN回歸,最后使用caret包中的RMSE函數(shù)評(píng)估模型的預(yù)測誤差。1.1.3KNN算法的優(yōu)缺點(diǎn)KNN算法的優(yōu)點(diǎn)包括:-算法簡單,易于理解和實(shí)現(xiàn)。-無需訓(xùn)練過程,可以處理非線性問題。-對(duì)異常值不敏感。KNN算法的缺點(diǎn)包括:-計(jì)算量大,尤其是當(dāng)數(shù)據(jù)集很大時(shí)。-需要選擇合適的K值,不同的K值可能對(duì)模型性能產(chǎn)生顯著影響。-對(duì)于不平衡的數(shù)據(jù)集,KNN算法可能表現(xiàn)不佳。示例代碼#生成不平衡數(shù)據(jù)集

unbalanced_data<-rbind(iris_data[1:100,],iris_data[121:150,])

unbalanced_label<-c(iris_label[1:100],iris_label[121:150])

#KNN分類

knn_result_unbalanced<-knn(train=unbalanced_data,test=test_data,cl=unbalanced_label,k=5)

#模型評(píng)估

confusionMatrix(knn_result_unbalanced,test_label)這段代碼展示了當(dāng)數(shù)據(jù)集不平衡時(shí),KNN算法可能面臨的挑戰(zhàn)。通過生成一個(gè)不平衡的數(shù)據(jù)集,可以看到模型在少數(shù)類上的預(yù)測性能可能會(huì)下降。1.2總結(jié)KNN算法是一種簡單但強(qiáng)大的機(jī)器學(xué)習(xí)方法,適用于分類和回歸任務(wù)。通過計(jì)算距離和選擇最近的鄰居,KNN能夠做出預(yù)測。然而,它也存在計(jì)算效率和K值選擇的挑戰(zhàn),特別是在處理大規(guī)模數(shù)據(jù)集和不平衡數(shù)據(jù)集時(shí)。通過上述代碼示例,我們不僅理解了KNN的基本原理,還學(xué)會(huì)了如何在R語言中實(shí)現(xiàn)KNN算法,并評(píng)估其性能。2R語言基礎(chǔ)2.1R語言環(huán)境搭建與基本操作在開始使用R語言進(jìn)行數(shù)據(jù)分析和機(jī)器學(xué)習(xí)之前,首先需要搭建R語言的環(huán)境。R語言是一個(gè)免費(fèi)且開源的統(tǒng)計(jì)計(jì)算和圖形軟件環(huán)境,廣泛應(yīng)用于數(shù)據(jù)科學(xué)領(lǐng)域。以下是如何在Windows系統(tǒng)上搭建R語言環(huán)境的步驟:下載R語言:訪問R語言的官方網(wǎng)站/,選擇適合你操作系統(tǒng)的版本進(jìn)行下載。安裝R語言:運(yùn)行下載的安裝程序,按照默認(rèn)設(shè)置完成安裝。安裝RStudio:RStudio是一個(gè)非常流行的R語言集成開發(fā)環(huán)境(IDE),它提供了更友好的用戶界面。訪問RStudio官網(wǎng)/下載并安裝RStudio。啟動(dòng)RStudio:安裝完成后,打開RStudio,你將看到一個(gè)包含多個(gè)窗格的界面,包括控制臺(tái)、文件管理器、幫助文檔和圖形界面。2.1.1R語言基本操作R語言提供了豐富的數(shù)據(jù)結(jié)構(gòu)和函數(shù),以下是一些基本操作的示例:#創(chuàng)建向量

vec<-c(1,2,3,4,5)

print(vec)

#創(chuàng)建矩陣

mat<-matrix(1:6,nrow=2,ncol=3)

print(mat)

#創(chuàng)建數(shù)據(jù)框

df<-data.frame(name=c("Alice","Bob"),age=c(25,30))

print(df)

#安裝和加載包

install.packages("ggplot2")

library(ggplot2)2.2數(shù)據(jù)導(dǎo)入與預(yù)處理在進(jìn)行數(shù)據(jù)分析或機(jī)器學(xué)習(xí)之前,數(shù)據(jù)的導(dǎo)入和預(yù)處理是必不可少的步驟。R語言提供了多種方式來導(dǎo)入數(shù)據(jù),包括從CSV、Excel、SQL數(shù)據(jù)庫等。2.2.1導(dǎo)入CSV數(shù)據(jù)#導(dǎo)入CSV文件

data<-read.csv("data.csv")

print(head(data))#查看數(shù)據(jù)的前幾行2.2.2數(shù)據(jù)預(yù)處理數(shù)據(jù)預(yù)處理包括數(shù)據(jù)清洗、缺失值處理、數(shù)據(jù)轉(zhuǎn)換等步驟。以下是一個(gè)簡單的數(shù)據(jù)預(yù)處理示例:#處理缺失值

data$age[is.na(data$age)]<-mean(data$age,na.rm=TRUE)

#轉(zhuǎn)換數(shù)據(jù)類型

data$age<-eger(data$age)

#刪除重復(fù)行

data<-unique(data)2.3使用R進(jìn)行數(shù)據(jù)可視化數(shù)據(jù)可視化是數(shù)據(jù)分析的重要組成部分,它可以幫助我們更好地理解數(shù)據(jù)。R語言中的ggplot2包是一個(gè)強(qiáng)大的繪圖工具,可以創(chuàng)建各種類型的圖表。2.3.1創(chuàng)建散點(diǎn)圖#創(chuàng)建散點(diǎn)圖

ggplot(data,aes(x=age,y=salary))+

geom_point()+

labs(title="AgevsSalary",x="Age",y="Salary")2.3.2創(chuàng)建直方圖#創(chuàng)建直方圖

ggplot(data,aes(x=salary))+

geom_histogram(binwidth=1000,color="black",fill="blue")+

labs(title="SalaryDistribution",x="Salary",y="Frequency")通過以上步驟,你已經(jīng)掌握了R語言的基礎(chǔ)環(huán)境搭建、基本操作、數(shù)據(jù)導(dǎo)入預(yù)處理以及數(shù)據(jù)可視化的方法。這些技能是進(jìn)行更復(fù)雜的數(shù)據(jù)分析和機(jī)器學(xué)習(xí)項(xiàng)目的基礎(chǔ)。接下來,你可以進(jìn)一步學(xué)習(xí)如何使用R語言進(jìn)行更高級(jí)的數(shù)據(jù)分析和建模。3機(jī)器學(xué)習(xí):K-近鄰算法(KNN):KNN算法的R語言實(shí)現(xiàn)3.1安裝與加載KNN相關(guān)的R包在R中實(shí)現(xiàn)KNN算法,我們通常會(huì)使用class和caret包。class包提供了knn函數(shù),而caret包則提供了更多的模型訓(xùn)練和評(píng)估工具,包括K值的選擇和模型優(yōu)化。3.1.1安裝R包#安裝class和caret包

install.packages("class")

install.packages("caret")3.1.2加載R包#加載class和caret包

library(class)

library(caret)3.2使用R包實(shí)現(xiàn)KNN分類KNN分類算法基于實(shí)例學(xué)習(xí),預(yù)測新樣本的類別是通過其在特征空間中最近的K個(gè)鄰居的類別來決定的。3.2.1數(shù)據(jù)準(zhǔn)備假設(shè)我們有一個(gè)數(shù)據(jù)集iris,我們將使用它來預(yù)測花的種類。#加載iris數(shù)據(jù)集

data(iris)

#分割數(shù)據(jù)集為訓(xùn)練集和測試集

set.seed(123)

trainIndex<-createDataPartition(iris$Species,p=0.8,list=FALSE)

trainData<-iris[trainIndex,]

testData<-iris[-trainIndex,]3.2.2KNN分類使用knn函數(shù)進(jìn)行分類預(yù)測。#使用knn進(jìn)行分類

k<-5

knnModel<-knn(train=trainData[,1:4],

test=testData[,1:4],

cl=trainData[,5],

k=k)3.2.3預(yù)測與評(píng)估評(píng)估模型的準(zhǔn)確性。#預(yù)測結(jié)果與實(shí)際結(jié)果的比較

confusionMatrix(knnModel,testData$Species)3.3使用R包實(shí)現(xiàn)KNN回歸KNN回歸算法與分類類似,但預(yù)測的是連續(xù)值。3.3.1數(shù)據(jù)準(zhǔn)備假設(shè)我們有一個(gè)回歸數(shù)據(jù)集mtcars,我們將使用它來預(yù)測汽車的mpg值。#加載mtcars數(shù)據(jù)集

data(mtcars)

#分割數(shù)據(jù)集為訓(xùn)練集和測試集

set.seed(123)

trainIndex<-createDataPartition(mtcars$mpg,p=0.8,list=FALSE)

trainData<-mtcars[trainIndex,]

testData<-mtcars[-trainIndex,]3.3.2KNN回歸使用knnreg函數(shù)進(jìn)行回歸預(yù)測。#使用knnreg進(jìn)行回歸

k<-5

knnRegModel<-knnreg(train=trainData[,2:11],

test=testData[,2:11],

y=trainData[,1],

k=k)3.3.3預(yù)測與評(píng)估評(píng)估模型的預(yù)測性能。#預(yù)測結(jié)果

predictions<-predict(knnRegModel,testData[,2:11])

#評(píng)估預(yù)測性能

postResample(predictions,testData$mpg)3.4K值的選擇與模型優(yōu)化選擇合適的K值對(duì)于KNN模型的性能至關(guān)重要。3.4.1K值的選擇使用交叉驗(yàn)證來選擇最佳的K值。#設(shè)置控制參數(shù)

control<-trainControl(method="cv",number=10)

#調(diào)整K值

knnTune<-train(x=trainData[,1:4],

y=trainData[,5],

method="knn",

trControl=control,

tuneLength=10)3.4.2模型優(yōu)化基于調(diào)整后的K值,優(yōu)化模型。#最佳K值

bestK<-knnTune$bestTune$k

#使用最佳K值重新訓(xùn)練模型

knnOptModel<-knn(train=trainData[,1:4],

test=testData[,1:4],

cl=trainData[,5],

k=bestK)3.4.3性能評(píng)估再次評(píng)估模型的性能。#評(píng)估優(yōu)化后的模型性能

confusionMatrix(knnOptModel,testData$Species)通過以上步驟,我們不僅實(shí)現(xiàn)了KNN算法在R中的應(yīng)用,還通過調(diào)整K值優(yōu)化了模型的性能。這為理解和應(yīng)用KNN算法提供了堅(jiān)實(shí)的基礎(chǔ)。4案例分析4.1subdir4.1:Iris數(shù)據(jù)集上的KNN分類實(shí)戰(zhàn)在本節(jié)中,我們將使用R語言和著名的Iris數(shù)據(jù)集來實(shí)現(xiàn)K-近鄰算法(KNN)進(jìn)行分類。Iris數(shù)據(jù)集包含了150個(gè)樣本,每個(gè)樣本有4個(gè)特征:萼片長度、萼片寬度、花瓣長度和花瓣寬度,以及一個(gè)類別標(biāo)簽,指示該樣本屬于三種鳶尾花中的哪一種。4.1.1數(shù)據(jù)準(zhǔn)備首先,我們需要加載數(shù)據(jù)并進(jìn)行預(yù)處理。#加載必要的庫

library(class)

library(caret)

#加載Iris數(shù)據(jù)集

data(iris)

#將數(shù)據(jù)集分為訓(xùn)練集和測試集

set.seed(123)

trainIndex<-createDataPartition(iris$Species,p=0.7,list=FALSE)

trainData<-iris[trainIndex,]

testData<-iris[-trainIndex,]4.1.2KNN模型訓(xùn)練接下來,我們將使用class包中的knn函數(shù)來訓(xùn)練KNN模型。#定義K值

k<-5

#使用knn函數(shù)進(jìn)行分類

predictedSpecies<-knn(train=trainData[,1:4],

test=testData[,1:4],

cl=trainData[,5],

k=k)4.1.3結(jié)果評(píng)估最后,我們將評(píng)估模型的準(zhǔn)確性。#比較預(yù)測結(jié)果和實(shí)際結(jié)果

confusionMatrix(predictedSpecies,testData$Species)4.2subdir4.2:波士頓房價(jià)數(shù)據(jù)集上的KNN回歸實(shí)戰(zhàn)在回歸問題中,KNN算法預(yù)測的是連續(xù)值。我們將使用波士頓房價(jià)數(shù)據(jù)集來演示KNN回歸。4.2.1數(shù)據(jù)準(zhǔn)備首先,加載數(shù)據(jù)并進(jìn)行預(yù)處理。#加載必要的庫

library(MASS)

library(caret)

#加載波士頓房價(jià)數(shù)據(jù)集

data(Boston)

#將數(shù)據(jù)集分為訓(xùn)練集和測試集

set.seed(123)

trainIndex<-createDataPartition(Boston$medv,p=0.7,list=FALSE)

trainData<-Boston[trainIndex,]

testData<-Boston[-trainIndex,]4.2.2KNN模型訓(xùn)練使用caret包中的knnreg函數(shù)來訓(xùn)練KNN回歸模型。#定義K值

k<-7

#使用knnreg函數(shù)進(jìn)行回歸

knnModel<-knnreg(train=trainData[,-14],

y=trainData$medv,

k=k)

#預(yù)測測試集的房價(jià)

predictedPrice<-predict(knnModel,newdata=testData[,-14])4.2.3結(jié)果評(píng)估評(píng)估模型的預(yù)測性能。#計(jì)算均方誤差

mse<-mean((predictedPrice-testData$medv)^2)

mse4.3subdir4.3:模型評(píng)估與結(jié)果解釋模型評(píng)估是機(jī)器學(xué)習(xí)中至關(guān)重要的一步,它幫助我們理解模型的性能和可靠性。4.3.1評(píng)估指標(biāo)對(duì)于分類問題,我們通常使用準(zhǔn)確率、召回率、F1分?jǐn)?shù)等指標(biāo)。對(duì)于回歸問題,我們關(guān)注均方誤差(MSE)、均方根誤差(RMSE)和R^2分?jǐn)?shù)。4.3.2結(jié)果解釋準(zhǔn)確率:表示分類正確的樣本占總樣本的比例。MSE:表示預(yù)測值與真實(shí)值之間的平均平方差,值越小表示模型預(yù)測越準(zhǔn)確。RMSE:MSE的平方根,更直觀地反映了預(yù)測誤差的大小。R^2分?jǐn)?shù):表示模型解釋了數(shù)據(jù)中多少變異,值越接近1表示模型擬合越好。4.3.3選擇合適的K值K值的選擇對(duì)KNN模型的性能有顯著影響。較小的K值會(huì)使模型對(duì)噪聲更敏感,而較大的K值則可能忽略數(shù)據(jù)的局部特征。通常,我們通過交叉驗(yàn)證來選擇最優(yōu)的K值。#使用caret包進(jìn)行交叉驗(yàn)證選擇K值

kTune<-train(x=trainData[,1:4],

y=trainData[,5],

method="knn",

preProcess=c("center","scale"),

tuneLength=10,

trControl=trainControl(method="cv",number=10))

#輸出最優(yōu)K值

kTune$bestTune$k通過上述步驟,我們不僅實(shí)現(xiàn)了KNN算法在R語言中的應(yīng)用,還學(xué)會(huì)了如何評(píng)估模型性能和選擇最優(yōu)的K值。這為我們?cè)趯?shí)際問題中應(yīng)用KNN算法提供了堅(jiān)實(shí)的基礎(chǔ)。5進(jìn)階技巧5.1距離度量的選擇在K-近鄰算法中,選擇合適的距離度量對(duì)于算法的性能至關(guān)重要。不同的距離度量可以捕捉到數(shù)據(jù)的不同特性,從而影響分類或回歸的準(zhǔn)確性。R語言提供了多種計(jì)算距離的函數(shù),如dist(),可以靈活地選擇不同的度量方式。5.1.1歐氏距離歐氏距離是最直觀的距離度量方式,適用于數(shù)值型特征。它計(jì)算兩個(gè)點(diǎn)在多維空間中的直線距離。#示例數(shù)據(jù)

data<-matrix(c(1,2,2,3,3,4),nrow=3,byrow=TRUE)

#計(jì)算歐氏距離

dist_euclidean<-dist(data,method="euclidean")

print(dist_euclidean)5.1.2曼哈頓距離曼哈頓距離,也稱為城市街區(qū)距離,適用于特征空間中各維度具有不同物理意義的情況。它計(jì)算兩個(gè)點(diǎn)在多維空間中沿軸方向的總距離。#計(jì)算曼哈頓距離

dist_manhattan<-dist(data,method="manhattan")

print(dist_manhattan)5.1.3馬氏距離馬氏距離考慮了數(shù)據(jù)的協(xié)方差結(jié)構(gòu),適用于特征之間存在相關(guān)性的數(shù)據(jù)集。它衡量了兩個(gè)點(diǎn)在多維空間中的標(biāo)準(zhǔn)化距離。#示例數(shù)據(jù),包含協(xié)方差

data_cov<-matrix(c(1,2,2,3,3,4,4,5,5,6,6,7),nrow=3,byrow=TRUE)

#計(jì)算馬氏距離

dist_mahalanobis<-mahalanobis(data_cov,colMeans(data_cov),cov(data_cov))

print(dist_mahalanobis)5.2權(quán)重分配策略KNN算法中,權(quán)重分配策略可以提高預(yù)測的準(zhǔn)確性。通常,距離更近的鄰居對(duì)預(yù)測結(jié)果的影響更大。5.2.1均等權(quán)重這是最簡單的權(quán)重策略,所有鄰居的權(quán)重相等。#均等權(quán)重的KNN預(yù)測

library(class)

#假設(shè)訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)

train_data<-matrix(c(1,2,2,3,3,4),nrow=3,byrow=TRUE)

train_labels<-c("A","B","A")

test_data<-matrix(c(1.5,2.5),nrow=1,byrow=TRUE)

#KNN預(yù)測

knn_prediction<-knn(train_data,test_data,train_labels,k=3)

print(knn_prediction)5.2.2距離加權(quán)距離加權(quán)策略中,鄰居的權(quán)重與它們到測試點(diǎn)的距離成反比。#距離加權(quán)的KNN預(yù)測

#自定義距離加權(quán)函數(shù)

knn_weighted<-function(train,test,labels,k){

dists<-as.matrix(dist(rbind(train,test),method="euclidean"))

dists<-dists[nrow(dists),1:nrow(train)]

weights<-1/dists

weights<-weights/sum(weights)

sorted_indices<-order(dists)

top_k_indices<-sorted_indices[1:k]

top_k_weights<-weights[top_k_indices]

top_k_labels<-labels[top_k_indices]

prediction<-weighted.mean(top_k_labels,top_k_weights)

return(round(prediction))

}

#示例數(shù)據(jù)

train_data<-matrix(c(1,2,2,3,3,4),nrow=3,byrow=TRUE)

train_labels<-c(1,2,1)

test_data<-matrix(c(1.5,2.5),nrow=1,byrow=TRUE)

#距離加權(quán)KNN預(yù)測

knn_weighted_prediction<-knn_weighted(train_data,test_data,train_labels,k=3)

print(knn_weighted_prediction)5.3處理不平衡數(shù)據(jù)集在現(xiàn)實(shí)世界的數(shù)據(jù)集中,各類別的樣本數(shù)量可能不均衡,這被稱為不平衡數(shù)據(jù)集問題。在KNN中,這可能導(dǎo)致預(yù)測偏向于樣本數(shù)量較多的類別。5.3.1重采樣重采樣技術(shù)包括過采樣和欠采樣,可以調(diào)整各類別樣本的數(shù)量,以達(dá)到平衡。過采樣#過采樣

library(DMwR)

#假設(shè)訓(xùn)練數(shù)據(jù)和標(biāo)簽

train_data_imbalanced<-matrix(c(1,2,2,3,3,4,4,5,5,6),nrow=5,byrow=TRUE)

train_labels_imbalanced<-c("A","A","A","B","B")

#過采樣

train_data_balanced<-SMOTE(train_data_imbalanced,train_labels_imbalanced,perc.over=100,k=5)欠采樣#欠采樣

library(caret)

#欠采樣

train_data_balanced<-downSample(train_data_imbalanced,train_labels_imbalanced)5.3.2成本敏感學(xué)習(xí)在KNN中,可以通過調(diào)整不同類別預(yù)測錯(cuò)誤的成本,來處理不平衡數(shù)據(jù)集問題。#成本敏感學(xué)習(xí)

#自定義預(yù)測函數(shù),考慮類別成本

knn_cost_sensitive<-function(train,test,labels,k,costs){

dists<-as.matrix(dist(rbind(train,test),method="euclidean"))

dists<-dists[nrow(dists),1:nrow(train)]

sorted_indices<-order(dists)

top_k_indices<-sorted_indices[1:k]

top_k_labels<-labels[top_k_indices]

#計(jì)算成本

cost<-sapply(top_k_labels,function(x)costs[x])

#預(yù)測類別

prediction<-which.min(cost)

return(prediction)

}

#示例數(shù)據(jù)

train_data_imbalanced<-matrix(c(1,2,2,3,3,4,4,5,5,6),nrow=5,byrow=TRUE)

train_labels_imbalanced<-c("A","A","A","B","B")

test_data<-matrix(c(1.5,2.5),nrow=1,byrow=TRUE)

#類別成本

costs<-c(A=1,B=2)

#成本敏感KNN預(yù)測

knn_cost_sensitive_prediction<-knn_cost_sensitive(train_data_imbalanced,test_data,train_labels_imbalanced,k=3,costs)

print(knn_cost_sensitive_prediction)通過上述進(jìn)階技巧,可以顯著提高KNN算法在復(fù)雜數(shù)據(jù)集上的性能和準(zhǔn)確性。6總結(jié)與實(shí)踐6.11KNN算法的總結(jié)回顧K-近鄰算法(K-NearestNeighbors,KNN)是一種基于實(shí)例的學(xué)習(xí)方法,用于分類和回歸。在分類問題中,KNN通過計(jì)算待分類樣本與訓(xùn)練集中所有樣本的距離,選取距離最近的K

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論