扎心實戰案例:麻(shi)雀(zhan)雖小,五臟俱全
鄔書豪,車聯網資料探勘工程師 ,R語言中文社群專欄作者。微信ID:tsaiedu
知乎專欄:https://www.zhihu.com/people/wu-shu-hao-67/activities
往期回顧
首先呢,猜測一下家的心思:這個推文是啥,標題這麼奇怪;哇,推文開頭的玻璃(還是碎玻璃)是啥?!還能不能看下去啊......
放心吧,能看的。這是一個對玻璃進行分類的問題,而且還是多分類不平衡問題。雖然說大家對玻璃並沒有啥興趣,但是實戰內容還是可以的哦。
廢話不說,直直直奔主題了!!!
本次實戰大致包括五部分:
視覺化
分層抽樣
決策樹
隨機森林
特徵選擇+隨機森林
## 載入後續分析所需程式包
## 載入所需的程式包
library(ggplot2)
library(Rmisc)
library(caret)
## 讀取資料+簡單探索
## 讀取資料+簡單探索
glass <- read.csv('../input/glass.csv')
str(glass)
summary(glass)
head(glass)
通過str函式對資料集進行簡單的結構探索,我們可以得到三個重要資訊:
·匯入的資料集是資料框型別
·該資料集有214行,10列
·所有變數均是數值
通過summary函式對資料集進行統計主要描述性統計量,我們得到了最小值、中位數、最大值等統計量,方便我們在一定程度上發現各個變數是否存在異常值(最終還得通過業務去決定)。
通過head函式,可以展示資料集的前六行。通過這三個函式,就可以大致對整個資料集產生一個輪廓。細心的人到這裡就會發現,到底是幾類啊,每一類有多少個樣本啊,通過簡單的探索也沒體現處理啊?!不著急,進行簡單的探索之後,下一步就用圖去探索一些上面為表達出的資訊,俗話說的好“能用圖不用表,能用表不用文字”。
## 描述性分析
## 探索不同類別的個數
glass$Type <- as.factor(glass$Type)
ggplot(glass, aes(x = Type, fill = Type)) +
geom_bar(width = 0.7) +
labs(x = 'Type', y = 'Count', title = 'The Number Of Different Types') +
theme_bw() +
theme(axis.text = element_text(size = rel(1)),
axis.title = element_text(size = rel(1.1)),
plot.title = element_text(size = rel(1.4), hjust = 0.5)) +
guides(fill = 'none')
看到這個圖,想必上面關於類別的疑問也就得到答覆了:一共6類,而且類別不平衡。到這裡不得不說一句,其實如果想簡單粗暴的檢視類別的資訊,可以直接使用table(glass$Type)去統計,但是呢,表現出來的效果不同,不同場合使用不同的方式才使最好的。接下來就使用箱線圖去探索一下每個自變數與因變數的關係。
## 箱線圖---variables VS type
var_names <- names(glass[-10])
gp <- lapply(var_names, function(x) {
ggplot(glass, aes(x = Type, y = eval(parse(text = x)), fill = Type)) +
geom_boxplot() +
labs(y = x, title = paste(x, "VS Type", sep = " ")) +
theme_bw() +
theme(axis.text = element_text(size = rel(1)),
axis.title = element_text(size = rel(1.1)),
plot.title = element_text(size = rel(1.2), hjust = 0.5)) +
guides(fill = 'none')
})
multiplot(plotlist = gp[1:6], cols = 2)
multiplot(plotlist = gp[7:9], cols = 3)
上面的9個箱線圖中有幾個比較醜,由於對業務的不熟悉和節省篇幅,所以我就不剔除離群點在進行繪圖了,有強迫症的可以自己剔除之後在繪圖。
通過這幾個圖呢,大致能看出不同的類別中不同元素和折射率的分佈情況。從一定程度上而言,變數分佈差距越明顯,那麼用該變數就更容易區分類別。再次宣告:本人不是從事玻璃行業的,不清楚業務問題,所以就不進行“異常值”的處理了,後續直接建模......
## 分層抽樣
分層抽樣是在不平衡分類問題中常用的一種抽樣方法,分層抽樣後的資料與原資料的分佈幾乎一致,也就意味著在此時屬於有效抽樣。
## 建立訓練集和測試集
set.seed(1234)
idx <- createDataPartition(glass$Type, p = 0.7, list = F)
traindata <- glass[idx, ]
testdata <- glass[-idx, ]
round(prop.table(table(glass$Type)), 3)
round(prop.table(table(traindata$Type)), 3)
round(prop.table(table(testdata$Type)), 3)
從上圖可以看出,不同的類別在原資料、訓練集和測試集中佔比還是比較一致的。由於資料集樣本較少,比例稍有差距,否則比例趨近一致。
#### 建模分類
## 決策樹
## 決策樹
ctrl <- trainControl(method = 'boot632', selectionFunction = 'oneSE')
set.seed(1234)
model_C50 <- train(Type ~., data = traindata, method = 'C5.0', trControl = ctrl)
pred_C50 <- predict(model_C50, testdata[-10])
confusionMatrix(pred_C50, testdata$Type) # 0.8361--0.7683
雖然說混淆矩陣的整體正確率不適合去評估類別不平衡的分類問題,但是並不是絕對的。通過此混淆矩陣的結果,可以看出類別少的樣本也有不錯的分類效果,所以說此混淆矩陣在這裡也是合適的,並且kappa值也達到了0.7683,說明模型達到了不錯的一致性。
## 隨機森林
## 隨機森林
set.seed(1234)
model_rf <- train(Type ~., data = traindata, method = 'rf', trControl = ctrl)
pred_rf <- predict(model_rf, testdata[-10])
confusionMatrix(pred_rf, testdata$Type) # 0.8361--0.7673
隨機森林的正確率也是0.8361,但是通過混淆矩陣的詳細情況,可發現預測的類別並不相同。kappa值為0.7673,略比決策樹低一點點。整體而言,隨機森林模型稍遜於決策樹模型。
## 特徵選擇+隨機森林
特徵選擇,簡而言之就是篩選出一些高質量的自變數作為最終建立模型的自變數,從而不僅降低模型的複雜度,並且防止過擬合的產生。
rfeControls_rf <- rfeControl(
functions = rfFuncs,
method = 'boot')
set.seed(1)
profile_rf <- rfe(x = traindata[-10],
y = traindata[, 10],
sizes = seq(4, 9, 1),
rfeControl = rfeControls_rf)
profile_rf
經過自定義特徵選擇之後,發現使用8個自變數作為建模變數為此時最好的選擇,所以我們嘗試使用8個自變數建模。
vars_new <- c(profile_rf$optVariables, 'Type')
set.seed(1234)
model_rf2 <- train(Type ~.,
data = traindata[vars_new],
method = 'rf',
trControl = ctrl)
pred_rf2 <- predict(model_rf2, testdata[-10])
confusionMatrix(pred_rf2, testdata$Type) # 0.8525--0.7905
經過特徵選擇,正確率稍微高了一點點。經過觀察混淆矩陣,發現第2類玻璃全部分類正確,之前預測錯了一個樣本,總而言之,也是提高了,並且模型的複雜度和過擬合性也有所降低。
到最後了,好像忘了一個重要的問題,玻璃的類別詳情如下:
1 building_windows_float_processed
2 building_windows_non_float_processed
3 vehicle_windows_float_processed
4 vehicle_windows_non_float_processed (none in this database)
5 containers
6 tableware
7 headlamps
注:本案例不提供資料集,如果要學習完整案例,點選文章底部閱讀原文或者掃描課程二維碼,購買包含資料集+程式碼+PPT的《kaggle十大案例精講課程》,購買學員會贈送文章的資料集。
《kaggle十大案例精講課程》提供程式碼+資料集+詳細程式碼註釋+老師講解PPT!綜合性的提高你的資料能力,資料處理+資料視覺化+建模一氣呵成!
相關課程推薦
Kaggle十大案例精講課程(連載中)
相關文章
- RPC - 麻雀雖小,五臟俱全RPC
- 《軍團/LEGIONCRAFT》:麻雀雖小五臟俱全Raft
- 天貓精靈方糖智慧音響評測:麻雀雖小,五臟俱全
- 我是這樣手寫 Spring 的(麻雀雖小五臟俱全)Spring
- 麻雀雖小五臟俱全的Vue拉勾專案,看看應該有幫助Vue
- Netty 實戰:如何編寫一個麻小俱全的 web 容器NettyWeb
- 心臟病不再擔心,人工智慧3D列印心臟人工智慧3D
- 婚姻扎心的真相
- Python實戰小案例,值得收藏!Python
- 扎心的運維告警運維
- 美國心臟病學院:研究發現每天玩手機五小時以上更易變胖
- 蘋果聯合創始人宣佈退出Facebook:小扎鬧心蘋果
- 上半年最強棋牌出海產品——日本麻將《雀魂》
- Flutter實戰】文字元件及五大案例Flutter字元元件
- 美國心臟協會:美國只有40%的產婦在懷孕前有良好的心臟健康
- 小程式入門到實戰(二)--案例原始碼分享原始碼
- 程式雖小,智慧並存
- 扎心!Kubernetes企業落地六大“難”
- 扎心!天天寫程式碼,方向真的對嗎?
- 關於OpenSSL“心臟出血”漏洞的分析
- 美國心臟協會雜誌:研究揭示大麻與心臟健康之間令人擔憂的聯絡
- 美國心臟協會:2022年美國心臟病和卒中統計資料包告(487頁)
- 終生不得心臟病的簡單方法
- WinDbg(3)實戰案例
- Sharding JDBC案例實戰JDBC
- 《心臟》:研究發現每週午休一到兩次心臟病發作/中風風險降低近50%
- 美國心臟協會:研究稱短時間內飲用大量能量飲料可能會危害心臟健康
- 扎心!“我學了半年Python,還是找不到工作”Python
- PHP陷入麻煩:核心人物加入PHP基金會PHP
- 《自然》:破解百年謎題,心臟確實可以直接影響情緒!
- JQuery8:實戰案例jQuery
- JavaScript8:實戰案例JavaScript
- 深度剖析Reflect + 實戰案例
- 美國心臟協會:患有心臟缺陷的人患新冠和死亡的風險更大
- 睡好是心臟良藥!《歐洲心臟雜誌》:保持良好睡眠模式可將患血管疾病的風險降低30%-60%模式
- 歐洲心臟病學會:研究稱每天只刷一次牙可能增加出現某些心臟問題的風險
- 美國心臟病學院:最新研究顯示每天喝咖啡可能有益於心臟並幫助延長壽命
- C++檔案操作實戰:建立、寫入、讀取、修改檔案一應俱全C++