R語言邏輯迴歸、GAM、LDA、KNN、PCA主成分分類分析預測房價及交叉驗證

發表於2024-03-04

全文連結:https://tecdat.cn/?p=35263

原文出處:拓端資料部落公眾號

本研究旨在幫助客戶利用房價資料集進行資料分析,該資料集包含82個變數和2930個資料點。研究目標是透過分類演算法將房價分為兩個類別。在資料預處理階段,排除了Order、PID和SalesPrice等變數,對資料進行整合和轉換以適應非線性關係。隨後運用邏輯迴歸、GAM、LDA和KNN等演算法進行建模和評估。

此外,透過PCA分析和不同分類模型的建模及交叉驗證,評估模型的效能並選擇最佳模型進行進一步分析和預測。綜合研究結果,邏輯迴歸和LDA模型表現較好,GAM模型在交叉驗證中表現最佳,而KNN模型表現較差。研究結果為資料分析和模型選擇提供了指導,有助於最佳化預測準確率和泛化能力。

本研究旨在使用Ames Housing資料進行資料分析,該資料集包含82個變數和2930個資料點。

image.png

分析目標:

運用分類演算法將Sales分成2個class,一個class是大於USD 200,000, 另一類小於USD 20,000。

分析要求:

1.       在變數中,去除以下變數:Order, PID, 以及SalesPrice

2.       用以下程式碼來定義本次分析的訓練資料,餘下的資料做驗證資料

3.       整合相關的變數,比如說把square feet加起來

4.       對資料進行變換(transformation),如果存在非線性關係

5.       進行least logistic regression(邏輯迴歸),  GAM, LDA, 和KNN

在變數中要去除Order, PID, 當然SalesPrice也要去掉。

AmesHousing=AmesHousing[,-c(1,2  )]

一個class是大於USD 200,000, 另一類小於USD 20,000

AmesHousing$SalePrice <-  ifelse(AmesHousing$SalePrice>200000,1,0)

檢查線性關係,如果不理想,則考慮進行轉換。

head(AmesHousing2)

 

合併關鍵詞

一些變數可能需要整合,如包含關鍵詞“Flr”、“Porch”、“Bath”、“Overall”、“Sold”、“SF”、“Year”、“AbvGr”、“Garage”和“Area”。


AmesHousing2$Flr=apply(AmesHousing2[,grep("Flr" ,colnames(AmesHousing2))],1,sum)
AmesHousing2=AmesHousing2[,-grep("Flr" ,colnames(AmesHousing2))[-length(grep("Flr" ,colnames(AmesHousing2)))]]

image.png

plot(AmesHousi2)

image.png

跑logistic regression, GAM, LDA, KNN這幾個模型

在資料準備完成後,可以透過執行不同的模型來進行分析。以下是對logistic regression、GAM、LDA和KNN模型的準確率評估:

1. 邏輯迴歸(Logistic Regression)模型:

對資料進行邏輯迴歸建模,程式碼如下:

model.glm <- glm(as.factor(SalePrice) ~ ., data = AmesHousing, family = "binomial")

透過邏輯迴歸模型的訓練和驗證,得到的準確率為0.932166301969365,表明模型在對銷售額進行分類預測時較為準確。

2. 廣義加性模型(Generalized Additive Model,GAM):

進行GAM建模,計算準確率如下:

misClasificError <- mean(fitted.results != Ames.test$SalePrice, na.rm = TRUE)  
print(paste('Accuracy', 1 - misClasificError))

GAM模型的準確率為0.911062906724512,顯示其在銷售額分類預測方面的表現。

3. K最近鄰(K-Nearest Neighbors,KNN)模型:

引入kknn庫進行KNN模型的建模和評估:

library(kknn)

print(paste('Accuracy', 1 - misClasificError))

KNN模型的準確率為0.585284280936455,相對較低,可能需要進一步調整模型引數或資料處理方式以提高準確性。

4. 線性判別分析(Linear Discriminant Analysis,LDA)模型:

對LDA模型的準確率進行評估:

misClasificError <- mean(fitted.results != Ames.test$SalePrice, na.rm = TRUE)  
print(paste('Accuracy', 1 - misClasificError))

LDA模型的準確率為0.923413566739606,顯示其在銷售額分類預測方面表現較好。

透過以上模型的評估結果,可以得知不同演算法在對銷售額進行分類預測時的表現。邏輯迴歸和LDA模型表現較為優異,而KNN模型的準確率相對較低,可能需要進一步最佳化。綜合考慮不同模型的準確率結果,可以選擇最適合資料集和分析目的的模型進行進一步研究和應用。

  • 邏輯迴歸模型的準確率為0.932166301969365。
  • 廣義加性模型(GAM)的準確率為0.911062906724512。
  • K最近鄰(KNN)模型的準確率為0.585284280936455。
  • 線性判別分析(LDA)模型的準確率為0.923413566739606。

透過以上分析,可以得出不同模型在預測銷售額類別上的準確率,進一步瞭解銷售額與其他變數之間的關係,為未來的預測和決策提供參考。

交叉驗證 (標準看最小的test error 驗證誤差)

交叉驗證是一種常用的機器學習方法,用於評估模型的效能並選擇最佳的超引數。在本文中,我們將使用交叉驗證來評估Logistic迴歸、LDA、KNN和GAM四種分類模型的效能。

logistic regression

首先,我們使用Logistic迴歸模型進行交叉驗證。我們將資料集分成10個不同的子集,每次使用其中9個子集進行訓練,然後在剩餘的一個子集上進行測試。重複這個過程10次,計算每次測試的準確率,並將所有準確率的平均值作為最終的準確率。經過計算,Logistic迴歸模型的平均準確率為0.9410194。

 
precisek=0  
k=10  
for(kk in 1:k){  
....

  precisek=precisek+1-misClasificError  
}

 

 1  th accuracy of logistic regression is  0.9491525
 2  th accuracy of logistic regression is  0.9321267
 3  th accuracy of logistic regression is  0.9434783
 4  th accuracy of logistic regression is  0.9244444
 5  th accuracy of logistic regression is  0.9480519
 6  th accuracy of logistic regression is  0.9480519
 7  th accuracy of logistic regression is  0.9356223
 8  th accuracy of logistic regression is  0.9516129
 9  th accuracy of logistic regression is  0.940678
10  th accuracy of logistic regression is  0.9369748
precisek/kcaculate precision
 [1] 0.9410194

 

LDA

接下來,我們使用LDA模型進行交叉驗證。同樣地,我們將資料集分成10個子集,每次訓練時使用9個子集,然後在剩餘的一個子集上進行測試。重複這個過程10次,計算每次測試的準確率,並計算平均準確率。經過計算,LDA模型的平均準確率為0.937719。

precisek=0  
k=10  
for(kk in 1:k){  
  


...

  cat(kk," th accuracy of LDA is ",1-misClasificError,"\n")  
  precisek=precisek+1-misClasificError  
}

 

 1  th accuracy of LDA is  0.9537815

 2  th accuracy of LDA is  0.9324324

 3  th accuracy of LDA is  0.9497908

 4  th accuracy of LDA is  0.9141631

 5  th accuracy of LDA is  0.9304348

 6  th accuracy of LDA is  0.9240506  
 7  th accuracy of LDA is  0.9396552

 8  th accuracy of LDA is  0.9471366

 9  th accuracy of LDA is  0.9672897

 10  th accuracy of LDA is  0.9184549

 


precisek/kcaculate precision

 [1] 0.937719

 

 

knn

 
然後,我們使用KNN模型進行交叉驗證。同樣地,我們將資料集分成10個子集,每次訓練時使用9個子集,然後在剩餘的一個子集上進行測試。重複這個過程10次,計算每次測試的準確率,並計算平均準確率。經過計算,KNN模型的平均準確率為0.5928328。

precisek=0  
k=10  
for(kk in 1:k){  
  


  cat(kk," th accuracy of KNN is ",1-misClasificError,"\n")  
  precisek=precisek+1-misClasificError  
}

 
 1  th accuracy of KNN is  0.6382253

 2  th accuracy of KNN is  0.5870307

 3  th accuracy of KNN is  0.5631399

 4  th accuracy of KNN is  0.556314

 5  th accuracy of KNN is  0.6143345

 6  th accuracy of KNN is  0.6075085

 7  th accuracy of KNN is  0.5733788

 8  th accuracy of KNN is  0.556314

 9  th accuracy of KNN is  0.6143345

 10  th accuracy of KNN is  0.6177474

precisek/kcaculate precision

 [1] 0.5928328

 

GAM

最後,我們使用GAM模型進行交叉驗證。同樣地,我們將資料集分成10個子集,每次訓練時使用9個子集,然後在剩餘的一個子集上進行測試。重複這個過程10次,計算每次測試的準確率,並計算平均準確率。經過計算,GAM模型的平均準確率為0.9217754。

precisek=0  
k=10  
for(kk in 1:k){  
  index=sample(1:dim(AmesHousing2)[1],floor(dim(AmesHousing2)[1]*(1/k)),     
  cat(kk," th accuracy of GAM is ",1-misClasificError,"\n")  
  precisek=precisek+1-misClasificError  
}
 1  th accuracy of GAM is  0.9429825  
 2  th accuracy of GAM is  0.8974359  
 3  th accuracy of GAM is  0.9116279  
 4  th accuracy of GAM is  0.9230769  
 5  th accuracy of GAM is  0.9173913  
 6  th accuracy of GAM is  0.8826087  
 7  th accuracy of GAM is  0.9531915  
 8  th accuracy of GAM is  0.9282511  
 9  th accuracy of GAM is  0.9469027  
 10  th accuracy of GAM is  0.9142857

 

precisek/kcaculate precision

 [1] 0.9217754
 

 綜合來看,我們可以看到LDA和GAM模型在這個資料集上表現較好,而Logistic迴歸和KNN模型的表現相對較差。因此,在選擇模型時,我們應該參考交叉驗證的結果,選擇表現最好的模型來進行進一步的分析和預測。

 

PCA

主成分分析(PCA)是一種常用的降維技術,可以幫助我們發現資料中的模式並減少特徵的數量。在本文中,我們首先對PCA進行了分析,透過主成分的方差和累積方差來評估主成分的重要性。根據PCA的結果,我們可以看到前幾個主成分的方差和累積方差,以及它們對資料的貢獻程度。

summary(pr.out)
 Importance of components:  
                           PC1    PC2     PC3     PC4     PC5     PC6  
 Standard deviation     2.1963 1.3088 1.14690 1.01946 0.99468 0.98157  
 Proportion of Variance 0.3216 0.1142 0.08769 0.06929 0.06596 0.06423  
 Cumulative Proportion  0.3216 0.4358 0.52348 0.59277 0.65873 0.72296  
                            PC7     PC8    PC9    PC10   PC11    PC12  
 Standard deviation     0.88807 0.83298 0.7520 0.70579 0.6686 0.63593  
 Proportion of Variance 0.05258 0.04626 0.0377 0.03321 0.0298 0.02696  
 Cumulative Proportion  0.77554 0.82179 0.8595 0.89270 0.9225 0.94946  
                           PC13   PC14    PC15  
 Standard deviation     0.58684 0.5254 0.37095  
 Proportion of Variance 0.02296 0.0184 0.00917  
 Cumulative Proportion  0.97242 0.9908 1.00000

__results___22_0.png

image.png

pve=pr.var/sum(pr.var)

image.png

image.png

接下來,我們對PCA降維後的資料使用Logistic迴歸、LDA、KNN和GAM四種分類模型進行建模,並評估它們的準確率。

logistic regression

  
misClasificError <- mean(fitted.results != Ames.test$SalePrice,na.rm=T)  
print(paste('Accuracy',1-misClasificError))

 [1] "Accuracy 0.984210526315789"

gam建模

library("mgcv")  
  

model.gam=gam(

)  
  
  
print(paste('Accuracy',1-misClasificError))

 

 [1] "Accuracy 0.975438596491228"

 

knn

 


library(kknn)  
  
  
model.kknn <- train.kknn(

 

 

print(paste('Accuracy',1-misClasificError))
 [1] "Accuracy 0.554385964912281"

 

 

LDA

 

misClasificError <- mean(fitted.results != Ames.test$SalePrice,na.rm=T)  
print(paste('Accuracy',1-misClasificError))
 [1] "Accuracy 0.978947368421053"  

在Logistic迴歸模型中,我們計算了模型的準確率為0.984210526315789;在GAM模型中,準確率為0.975438596491228;在KNN模型中,準確率為0.554385964912281;在LDA模型中,準確率為0.978947368421053。透過比較這些準確率,我們可以看到Logistic迴歸和LDA模型表現較好,而KNN模型表現較差。
 

 

交叉驗證 (標準看最小的test error 驗證誤差)

接著,我們進行了交叉驗證,透過計算十次驗證的準確率並求平均值來評估模型的效能。

logistic regression

precisek=0  
k=10  
for(kk in 1:k){  
  


  cat(kk," th accuracy of logistic regression is ",1-misClasificError,"\n")  
  precisek=precisek+1-misClasificError  
}
precisek/kcaculate precision
 [1] 0.9779736

 

 

LDA

precisek=0  
k=10  
for(kk in 1:k){  
  


  cat(kk," th accuracy of LDA is ",1-misClasificError,"\n")  
  precisek=precisek+1-misClasificError  
}
precisek/kcaculate precision
 [1] 0.9792952

 

 

knn

precisek=0  
k=10  
for(kk in 1:k){  
  


   
  cat(kk," th accuracy of KNN is ",1-misClasificError,"\n")  
  precisek=precisek+1-misClasificError  
}

 

precisek/kcaculate precision
 [1] 0.9656388

 

 

GAM

precisek=0  
k=10  
for(kk in 1:k){  
 


  cat(kk," th accuracy of GAM is ",1-misClasificError,"\n")  
  precisek=precisek+1-misClasificError  
}

 

precisek/kcaculate precision

 [1] 0.9814978

在Logistic迴歸模型中,十次驗證的平均準確率為0.9779736;在LDA模型中,平均準確率為0.9792952;在KNN模型中,平均準確率為0.9656388;在GAM模型中,平均準確率為0.9814978。透過交叉驗證的結果,我們可以看到GAM模型在這個資料集上表現最好,而KNN模型表現相對較差。

綜上所述,透過PCA的分析和不同分類模型的建模及交叉驗證,我們可以評估模型的效能並選擇最佳的模型來進行進一步的分析和預測。在實際應用中,我們應該根據實際情況和需求選擇合適的模型,並不斷最佳化和調整模型以提高預測準確率和泛化能力。

1536x1536-hero-lessonsgrowth-v3.jpg

相關文章