標籤:

機器學習——線性回歸方法(基於R的實現)

  1. 線性回歸預測醫療費用
  • 讀取數據和查看數據

> data<-read.csv("insurance.csv",stringsAsFactors = T)n> str(data)ndata.frame:t1338 obs. of 7 variables:n $ age : int 19 18 28 33 32 31 46 37 37 60 ...n $ sex : Factor w/ 2 levels "female","male": 1 2 2 2 2 1 1 1 2 1 ...n $ bmi : num 27.9 33.8 33 22.7 28.9 ...n $ children: int 0 1 3 0 0 0 1 3 2 0 ...n $ smoker : Factor w/ 2 levels "no","yes": 2 1 1 1 1 1 1 1 1 1 ...n $ region : Factor w/ 4 levels "northeast","northwest",..: 4 3 3 2 2 3 3 2 1 2 ...n $ charges : num 16885 1726 4449 21984 3867 ...n

數據共7個變數 1338行數據,3個因子型變數,4個數值型變數。

"age" "sex" "bmi" "children" "smoker" "region" "charges" n

年紀 性別 身體質量指數 撫養兒童數量 吸煙者 地區 費用

> sum(is.na(data))n[1] 0n

沒有發現缺失值

2.探索和準備數據

由於我們本次預測的因變數為charge,我們查看他的分布:

> attach(data)n> summary(charges)n Min. 1st Qu. Median Mean 3rd Qu. Max. n 1122 4740 9382 13270 16640 63770 n

由於mean(平均值)遠遠大於median(中位數),故醫療費用的分布是右偏的。這裡我們適用直觀的直方圖來證實。

library("ggplot2")nbinsize<-diff(range(charges))/15nggplot(data,aes(x=charges))+n geom_histogram(binwidth = binsize,fill="blue",colour="black")n

絕大多數的個人每年醫療費用都在(0~1600美元),由於線性回歸假設因變數屬於正態分布,所以這種分布很不理想。在實際應用中,線性回歸的假設往往會與被違背。如果需要,我們在後面會修改該假設。

  • 探索特徵之間的相關性

> library("psych")n> cor(data[c("age","bmi","children","charges")])n age bmi children chargesnage 1.0000000 0.1092719 0.04246900 0.29900819nbmi 0.1092719 1.0000000 0.01275890 0.19834097nchildren 0.0424690 0.0127589 1.00000000 0.06799823ncharges 0.2990082 0.1983410 0.06799823 1.00000000n

這裡我們可以看到age與bim,chagers成正相關,相關係數相對較強,而chagers與children也成正相關,相關係數相對較弱。

相關性的可視化

> library("psych")n> pairs.panels(data[c("age","bmi","children","charges")])n

每個散點圖中呈現橢圓的對象稱為相關橢圓,橢圓的中心點表示變數x軸的均值與y軸變數的確定點。橢圓越圓表示兩個兩個變數之間的相關性越差,橢圓拉扯的越厲害表示兩個變數的相關性質越強。散點圖繪製的曲線稱為局部回歸平滑,他表示x/y周變數之間的關係。圖中age與children局部回歸平滑為一個類似倒立的「U」,這就意味著,年紀相對小的人與年紀相對大的人比年紀在中年的擁有的孩子要少。另外chagers與age局部平滑呈上升的趨勢,這就意味著隨著年紀的增大所需的醫療費用也會增加。圖中的數字表示相關性係數。

3.基於數據訓練模型

> library("psych")n> pairs.panels(data[c("age","bmi","children","charges")])n> ins_model<-lm(charges~age+children+bmi+sex+smoker+region,data=data)n> ins_model<-lm(charges~.,data=data)#上面模型的簡寫n> ins_modelnnCall:nlm(formula = charges ~ ., data = data)nnCoefficients:n (Intercept) age sexmale bmi n -11938.5 256.9 -131.3 339.2 n children smokeryes regionnorthwest regionsoutheast n 475.5 23848.5 -353.0 -1035.0 nregionsouthwest n -960.1 n

3.模型評估

> summary(ins_model)nnCall:nlm(formula = charges ~ ., data = data)nnResiduals:n Min 1Q Median 3Q Max n-11304.9 -2848.1 -982.1 1393.9 29992.8 nnCoefficients:n Estimate Std. Error t value Pr(>|t|) n(Intercept) -11938.5 987.8 -12.086 < 2e-16 ***nage 256.9 11.9 21.587 < 2e-16 ***nsexmale -131.3 332.9 -0.394 0.693348 nbmi 339.2 28.6 11.860 < 2e-16 ***nchildren 475.5 137.8 3.451 0.000577 ***nsmokeryes 23848.5 413.1 57.723 < 2e-16 ***nregionnorthwest -353.0 476.3 -0.741 0.458769 nregionsoutheast -1035.0 478.7 -2.162 0.030782 * nregionsouthwest -960.0 477.9 -2.009 0.044765 * n---nSignif. codes: 0 『***』 0.001 『**』 0.01 『*』 0.05 『.』 0.1 『 』 1nnResidual standard error: 6062 on 1329 degrees of freedomnMultiple R-squared: 0.7509,tAdjusted R-squared: 0.7494 nF-statistic: 500.8 on 8 and 1329 DF, p-value: < 2.2e-16n

summary(ins_model)提供了以下信息

  • Residuals(殘差)

由於殘差=真實值-預測值,所以,本模型最大誤差將近300000。另一方面50%落在Q1-Q3,所以大部分誤差區間為[-1393.9,2848.1]。

  • 星號(*)

星號表示模型中每個特徵的預測能力。星號越多,表示與因變數的相關性越強。

  • 多元R方值

由於R方值為0.7494,所以近75%的變數可以由模型解釋。

綜上所以,整體來說模型性能還不錯。

4.模型性能提高

  • 添加非線性關係

我們前面所假定的都是一元線性,我們可以把一些現實中不是符合一元線性的變成多元的。例如本例子中age(年齡)對chagers(醫療費用)的影響不可能是恆定的,對於老年人可能會過於昂貴。所以我們試著把增加一個二元變數

> data$age2<-age^2n> ins_model2<-lm(charges~.,data=data)n> summary(ins_model2)nnCall:nlm(formula = charges ~ ., data = data)nnResiduals:n Min 1Q Median 3Q Max n-11665.1 -2855.8 -944.1 1295.9 30826.0 nnCoefficients:n Estimate Std. Error t value Pr(>|t|) n(Intercept) -6596.665 1689.444 -3.905 9.91e-05 ***nage -54.575 80.991 -0.674 0.500532 nsexmale -138.428 331.197 -0.418 0.676043 nbmi 335.211 28.467 11.775 < 2e-16 ***nchildren 642.024 143.617 4.470 8.47e-06 ***nsmokeryes 23859.745 410.988 58.055 < 2e-16 ***nregionnorthwest -367.812 473.783 -0.776 0.437692 nregionsoutheast -1031.503 476.172 -2.166 0.030470 * nregionsouthwest -957.546 475.417 -2.014 0.044198 * nage2 3.927 1.010 3.887 0.000107 ***n---nSignif. codes: 0 『***』 0.001 『**』 0.01 『*』 0.05 『.』 0.1 『 』 1nnResidual standard error: 6030 on 1328 degrees of freedomnMultiple R-squared: 0.7537,tAdjusted R-squared: 0.752 nF-statistic: 451.6 on 9 and 1328 DF, p-value: < 2.2e-16n

由此可見整體模型的正確率提高了3個百分點。

  • 將一個數值型的變數轉換成一個二進位指標

假設bmi值超過30的時候,它對醫療費用的影響會急劇增長。我們可以設置bmi>30,為1,bmi<30,為0。

> ins_model<-lm(charges~.,data=data)n> ins_model2<-lm(charges~.,data=data)n> summary(ins_model2)nnCall:nlm(formula = charges ~ ., data = data)nnResiduals:n Min 1Q Median 3Q Max n-12525.0 -3381.3 160.9 1311.3 29258.3 nnCoefficients:n Estimate Std. Error t value Pr(>|t|) n(Intercept) -2852.423 1825.191 -1.563 0.118336 nage -26.238 80.416 -0.326 0.744261 nsexmale -159.152 328.097 -0.485 0.627703 nbmi 148.123 46.045 3.217 0.001327 ** nchildren 627.304 142.291 4.409 1.12e-05 ***nsmokeryes 23864.986 407.112 58.620 < 2e-16 ***nregionnorthwest -401.016 469.358 -0.854 0.393041 nregionsoutheast -884.246 472.549 -1.871 0.061534 . nregionsouthwest -929.552 470.963 -1.974 0.048620 * nage2 3.573 1.003 3.562 0.000382 ***nbmi30 2813.900 547.483 5.140 3.16e-07 ***n---nSignif. codes: 0 『***』 0.001 『**』 0.01 『*』 0.05 『.』 0.1 『 』 1nnResidual standard error: 5973 on 1327 degrees of freedomnMultiple R-squared: 0.7585,tAdjusted R-squared: 0.7567 nF-statistic: 416.8 on 10 and 1327 DF, p-value: < 2.2e-16n

顯而易得,次模型相對上個模型準確率又提高了。

  • 加入相互的作用

吸煙和肥胖兩個指標存在相互影響。如下進行建模,

> ins_model3<-lm(charges~age+age2+children+bmi+sex+bmi30+sex+bmi30*smoker+region,n+ data = data)n> summary(ins_model3)nnCall:nlm(formula = charges ~ age + age2 + children + bmi + sex + bmi30 + n sex + bmi30 * smoker + region, data = data)nnResiduals:n Min 1Q Median 3Q Max n-4260.3 -1644.6 -1272.7 -784.7 24192.7 nnCoefficients:n Estimate Std. Error t value Pr(>|t|) n(Intercept) 69.2494 1353.2349 0.051 0.959195 nage -21.6786 59.4956 -0.364 0.715638 nage2 3.5978 0.7422 4.847 1.40e-06 ***nchildren 661.5105 105.2784 6.283 4.48e-10 ***nbmi 114.2920 34.0816 3.353 0.000821 ***nsexmale -475.6760 242.9293 -1.958 0.050430 . nbmi30 -938.5116 420.5807 -2.231 0.025817 * nsmokeryes 13421.6370 435.9158 30.790 < 2e-16 ***nregionnorthwest -275.6659 347.2730 -0.794 0.427453 nregionsoutheast -826.1187 349.6181 -2.363 0.018275 * nregionsouthwest -1164.8152 348.5123 -3.342 0.000854 ***nbmi30:smokeryes 19912.6072 600.8493 33.141 < 2e-16 ***n---nSignif. codes: 0 『***』 0.001 『**』 0.01 『*』 0.05 『.』 0.1 『 』 1nnResidual standard error: 4419 on 1326 degrees of freedomnMultiple R-squared: 0.8679,tAdjusted R-squared: 0.8668 nF-statistic: 792.1 on 11 and 1326 DF, p-value: < 2.2e-16n

我們依次把模型的準確率從將近75%提到了86.6%,這一點非常驚人!

我們對模型的改進依次為:

  • 增加了非線性年齡項
  • 創建了肥胖指標
  • 指定了吸煙者和肥胖之間的相互作用

5.預測

p<-predict(m,test)n

m:訓練的模型

test:需預測的數據框


推薦閱讀:

酷炫的matplotlib
隨機森林——二元分類的利器之Kaggle初體驗Titanic: Machine Learning from Disaster
快播CEO王欣快出獄了,當年舉報他的那個人面臨的是?
「ggplot2」的起手式------qplot函數

TAG:数据分析 |