機器學習——線性回歸方法(基於R的實現)
- 線性回歸預測醫療費用
- 讀取數據和查看數據
> 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
- 探索特徵之間的相關性
> 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
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:数据分析 |