机器学习案例-信用卡诈骗识别。
數據簡介
本次數據為歐洲的信用卡的持卡人在2013年9月某兩天的交易數據,由于涉及到數據的敏感性問題其中V1~V28的變量都是進行了主成分分析后合成的脫敏的數據。
變量名稱介紹
數據預處理
導入數據及數據初步展示
data <- read.csv("creditcard.csv") head(data)#導入數據還可以使用reader包中的read_csv()函數,它可以顯示導入數據的進度。library(readr) data <- read_csv("creditcard.csv") #把數據轉換為數據框格式 data <- as.data.frame(data) > #查看數據的基本結構和類型 > str(data) Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 284807 obs. of 31 variables:$ Time : num 0 0 1 1 2 2 4 7 7 9 ...$ V1 : num -1.36 1.192 -1.358 -0.966 -1.158 ...$ V2 : num -0.0728 0.2662 -1.3402 -0.1852 0.8777 ...$ V3 : num 2.536 0.166 1.773 1.793 1.549 ...$ V4 : num 1.378 0.448 0.38 -0.863 0.403 ...$ V5 : num -0.3383 0.06 -0.5032 -0.0103 -0.4072 ...$ V6 : num 0.4624 -0.0824 1.8005 1.2472 0.0959 ...$ V7 : num 0.2396 -0.0788 0.7915 0.2376 0.5929 ...$ V8 : num 0.0987 0.0851 0.2477 0.3774 -0.2705 ...$ V9 : num 0.364 -0.255 -1.515 -1.387 0.818 ...$ V10 : num 0.0908 -0.167 0.2076 -0.055 0.7531 ...$ V11 : num -0.552 1.613 0.625 -0.226 -0.823 ...$ V12 : num -0.6178 1.0652 0.0661 0.1782 0.5382 ...$ V13 : num -0.991 0.489 0.717 0.508 1.346 ...$ V14 : num -0.311 -0.144 -0.166 -0.288 -1.12 ...$ V15 : num 1.468 0.636 2.346 -0.631 0.175 ...$ V16 : num -0.47 0.464 -2.89 -1.06 -0.451 ...$ V17 : num 0.208 -0.115 1.11 -0.684 -0.237 ...$ V18 : num 0.0258 -0.1834 -0.1214 1.9658 -0.0382 ...$ V19 : num 0.404 -0.146 -2.262 -1.233 0.803 ...$ V20 : num 0.2514 -0.0691 0.525 -0.208 0.4085 ...$ V21 : num -0.01831 -0.22578 0.248 -0.1083 -0.00943 ...$ V22 : num 0.27784 -0.63867 0.77168 0.00527 0.79828 ...$ V23 : num -0.11 0.101 0.909 -0.19 -0.137 ...$ V24 : num 0.0669 -0.3398 -0.6893 -1.1756 0.1413 ...$ V25 : num 0.129 0.167 -0.328 0.647 -0.206 ...$ V26 : num -0.189 0.126 -0.139 -0.222 0.502 ...$ V27 : num 0.13356 -0.00898 -0.05535 0.06272 0.21942 ...$ V28 : num -0.0211 0.0147 -0.0598 0.0615 0.2152 ...$ Amount: num 149.62 2.69 378.66 123.5 69.99 ...$ Class : num 0 0 0 0 0 0 0 0 0 0 ...- attr(*, "spec")=.. cols(.. Time = col_double(),.. V1 = col_double(),.. V2 = col_double(),.. V3 = col_double(),.. V4 = col_double(),.. V5 = col_double(),.. V6 = col_double(),.. V7 = col_double(),.. V8 = col_double(),.. V9 = col_double(),.. V10 = col_double(),.. V11 = col_double(),.. V12 = col_double(),.. V13 = col_double(),.. V14 = col_double(),.. V15 = col_double(),.. V16 = col_double(),.. V17 = col_double(),.. V18 = col_double(),.. V19 = col_double(),.. V20 = col_double(),.. V21 = col_double(),.. V22 = col_double(),.. V23 = col_double(),.. V24 = col_double(),.. V25 = col_double(),.. V26 = col_double(),.. V27 = col_double(),.. V28 = col_double(),.. Amount = col_double(),.. Class = col_double().. ) > summary(data)Time V1 V2 V3 V4 V5 V6 Min. : 0 Min. :-56.40751 Min. :-72.71573 Min. :-48.3256 Min. :-5.68317 Min. :-113.74331 Min. :-26.1605 1st Qu.: 54202 1st Qu.: -0.92037 1st Qu.: -0.59855 1st Qu.: -0.8904 1st Qu.:-0.84864 1st Qu.: -0.69160 1st Qu.: -0.7683 Median : 84692 Median : 0.01811 Median : 0.06549 Median : 0.1799 Median :-0.01985 Median : -0.05434 Median : -0.2742 Mean : 94814 Mean : 0.00000 Mean : 0.00000 Mean : 0.0000 Mean : 0.00000 Mean : 0.00000 Mean : 0.0000 3rd Qu.:139321 3rd Qu.: 1.31564 3rd Qu.: 0.80372 3rd Qu.: 1.0272 3rd Qu.: 0.74334 3rd Qu.: 0.61193 3rd Qu.: 0.3986 Max. :172792 Max. : 2.45493 Max. : 22.05773 Max. : 9.3826 Max. :16.87534 Max. : 34.80167 Max. : 73.3016 V7 V8 V9 V10 V11 V12 V13 Min. :-43.5572 Min. :-73.21672 Min. :-13.43407 Min. :-24.58826 Min. :-4.79747 Min. :-18.6837 Min. :-5.79188 1st Qu.: -0.5541 1st Qu.: -0.20863 1st Qu.: -0.64310 1st Qu.: -0.53543 1st Qu.:-0.76249 1st Qu.: -0.4056 1st Qu.:-0.64854 Median : 0.0401 Median : 0.02236 Median : -0.05143 Median : -0.09292 Median :-0.03276 Median : 0.1400 Median :-0.01357 Mean : 0.0000 Mean : 0.00000 Mean : 0.00000 Mean : 0.00000 Mean : 0.00000 Mean : 0.0000 Mean : 0.00000 3rd Qu.: 0.5704 3rd Qu.: 0.32735 3rd Qu.: 0.59714 3rd Qu.: 0.45392 3rd Qu.: 0.73959 3rd Qu.: 0.6182 3rd Qu.: 0.66251 Max. :120.5895 Max. : 20.00721 Max. : 15.59500 Max. : 23.74514 Max. :12.01891 Max. : 7.8484 Max. : 7.12688 V14 V15 V16 V17 V18 V19 V20 Min. :-19.2143 Min. :-4.49894 Min. :-14.12985 Min. :-25.16280 Min. :-9.498746 Min. :-7.213527 Min. :-54.49772 1st Qu.: -0.4256 1st Qu.:-0.58288 1st Qu.: -0.46804 1st Qu.: -0.48375 1st Qu.:-0.498850 1st Qu.:-0.456299 1st Qu.: -0.21172 Median : 0.0506 Median : 0.04807 Median : 0.06641 Median : -0.06568 Median :-0.003636 Median : 0.003735 Median : -0.06248 Mean : 0.0000 Mean : 0.00000 Mean : 0.00000 Mean : 0.00000 Mean : 0.000000 Mean : 0.000000 Mean : 0.00000 3rd Qu.: 0.4931 3rd Qu.: 0.64882 3rd Qu.: 0.52330 3rd Qu.: 0.39968 3rd Qu.: 0.500807 3rd Qu.: 0.458949 3rd Qu.: 0.13304 Max. : 10.5268 Max. : 8.87774 Max. : 17.31511 Max. : 9.25353 Max. : 5.041069 Max. : 5.591971 Max. : 39.42090 V21 V22 V23 V24 V25 V26 Min. :-34.83038 Min. :-10.933144 Min. :-44.80774 Min. :-2.83663 Min. :-10.29540 Min. :-2.60455 1st Qu.: -0.22839 1st Qu.: -0.542350 1st Qu.: -0.16185 1st Qu.:-0.35459 1st Qu.: -0.31715 1st Qu.:-0.32698 Median : -0.02945 Median : 0.006782 Median : -0.01119 Median : 0.04098 Median : 0.01659 Median :-0.05214 Mean : 0.00000 Mean : 0.000000 Mean : 0.00000 Mean : 0.00000 Mean : 0.00000 Mean : 0.00000 3rd Qu.: 0.18638 3rd Qu.: 0.528554 3rd Qu.: 0.14764 3rd Qu.: 0.43953 3rd Qu.: 0.35072 3rd Qu.: 0.24095 Max. : 27.20284 Max. : 10.503090 Max. : 22.52841 Max. : 4.58455 Max. : 7.51959 Max. : 3.51735 V27 V28 Amount Class Min. :-22.565679 Min. :-15.43008 Min. : 0.00 Min. :0.000000 1st Qu.: -0.070840 1st Qu.: -0.05296 1st Qu.: 5.60 1st Qu.:0.000000 Median : 0.001342 Median : 0.01124 Median : 22.00 Median :0.000000 Mean : 0.000000 Mean : 0.00000 Mean : 88.35 Mean :0.001728 3rd Qu.: 0.091045 3rd Qu.: 0.07828 3rd Qu.: 77.17 3rd Qu.:0.000000 Max. : 31.612198 Max. : 33.84781 Max. :25691.16 Max. :1.000000 > #查看樣本類別比例 > table(data$Class)0 1 284315 492 > prop.table(table(data$Class))0 1 0.998272514 0.001727486缺失值識別
#可視化展示缺失值情況 > #使用VIM包中的aggr函數畫出缺失值的圖 > library(VIM) > aggr(data,prop=F,number=T) > sum(!complete.cases(data)) [1] 0
從缺失值圖形及缺失值計算結果看均為沒有缺失值所以不需要處理。
分層抽樣
處理類別不平衡問題
由于數據中類別為詐騙數據和非詐騙數據的樣本數差距過大,會影響建模的準確性。
所以我們從類別為詐騙的樣本數據中抽取和非詐騙數據的樣本數一樣的樣本,然后合并在一起組成一個新的樣本。
這樣在新的樣本中詐騙數據和非詐騙數據就一致了。這樣就解決了類別不平衡的問題了。
數據的標準化
#使用函數scale進行數據的標準化 #scale的原理為每一列數據減去此列的平均值然后再除去標準差 #如果是只是減去列的平均值的話就是數據的中心話 #對data_end數據進行標準化處理 data_s <- data_end data_s[,1:30] <- scale(data_s[,1:30]) #對train數據進行標準化處理 train2 <- train train2[,1:30] <- scale(train2[,1:30])#對test數據進行標準化處理 test2 <- test test2[,1:30] <- scale(test2[,1:30])描述性分析
繪制不同時間詐騙次數的條形圖
library(ggplot2) #把Time_Hour列轉換為因子 data_1$Time_Hour <- as.factor(data_1$Time_Hour)ggplot(data_1,aes(Time_Hour,fill=Time_Hour)) +geom_bar()+theme_minimal()+theme(legend.position="none")
從圖中可以發現詐騙最多的時候大多集中在凌晨的2點和上午的11點左右
繪制不同時間詐騙金額的箱線圖
#繪制不同時間詐騙金額的箱線圖 ggplot(data_1,aes(Time_Hour,Amount,fill=Time_Hour))+geom_boxplot()+theme_minimal()+theme(legend.position = "none")
整體而言詐騙金額平均為125左右,但是詐騙金額波動性比較大,最大的有2000多。
繪制不同時間詐騙金額的條形圖
#繪制不同時間詐騙金額的條形圖 Time_Amount <- aggregate(data_1$Amount,by=list(Time = data_1$Time_Hour),mean)ggplot(Time_Amount,aes(Time,x,fill=Time))+geom_bar(stat = "identity")+theme_minimal()+theme(legend.position="none")
平均詐騙金額最高的是在第二天的12點,整體而言平均詐騙金額分布在125左右。
自動參數調整
使用caret包進行自動參數調整
參數調整是提升模型性能的一個重要過程,大多數機器學習算法都至少調整一個參數,而大多數復雜的模型都可以調整多個參數值來調整模型從而進行更好的擬合。
例如,尋找更適合的K值來調整K近鄰模型,調節隱層層數和隱藏層的節點數等優化神經網絡模型,支持向量機模型中調整核函數,“軟邊界”懲罰大小等進行優化。
雖然這可以讓模型更適合數據,但是嘗試所有可能的選項會非常復雜,所以需要一種更系統的方式。
使用iris數據介紹caret包中的自動調整參數的功能
> #自動參數調整 > #使用caret包進行自動參數調整 > #舉例 > #使用決策樹模型對iris數據進行建模, > #使用caret包中的train函數進行建模并進行自動參數調整 > > library(caret) > set.seed(1234) > m_C50 <- train(Species~., data=iris,method='C5.0') There were 40 warnings (use warnings() to see them) > m_C50 C5.0 150 samples4 predictor3 classes: 'setosa', 'versicolor', 'virginica' No pre-processing Resampling: Bootstrapped (25 reps) Summary of sample sizes: 150, 150, 150, 150, 150, 150, ... Resampling results across tuning parameters:model winnow trials Accuracy Kappa rules FALSE 1 0.9353579 0.9019696rules FALSE 10 0.9370844 0.9045424rules FALSE 20 0.9325835 0.8976068rules TRUE 1 0.9382311 0.9062975rules TRUE 10 0.9407392 0.9099910rules TRUE 20 0.9385430 0.9066136tree FALSE 1 0.9347127 0.9009924tree FALSE 10 0.9369888 0.9044013tree FALSE 20 0.9332286 0.8985820tree TRUE 1 0.9375860 0.9053246tree TRUE 10 0.9399845 0.9088007tree TRUE 20 0.9392443 0.9076915Accuracy was used to select the optimal model using thelargest value. The final values used for the model were trials = 10, model =rules and winnow = TRUE.結果中包含候選模型的評估列表,可以發現共建立并測試了12個模型,基于3個C5.0調整參數的組合:model, trials和winnow。每個候選模型都給出了模型精度和Kappa統計量,最下方還展示了最佳后選模型所對應的參數值。
Kappa用來統計衡量模型的穩定性
很差的一致性: <0.2
尚可的一致性: 0.2~0.4
中等的一致性: 0.4~0.6
不錯的一致性: 0.6~0.8
很好的餓一致性:0.8~1
定制調參數
定制調參需要時通過設置train中trControl及trGrid兩個參數進行定制的。而設置這兩個參數需要分別用到trainControl函數及expand.grid函數進行設置,參數trControl主要用來設置重抽樣的方法例如設置使用五折交叉驗證的方法,trGrid是用來指定可以調整哪些參數及調整的范圍。
定制調參的過程
trainControl()函數用來創建一系列的配置選項,這些選項考慮到了諸如重抽樣策略以及用于選擇最佳模型的度量這些模型評價標準的管理。以上我們專注于兩個主要參數:method和selectionFunction.
以上我們使用的是五折交叉驗證的重抽樣方法;
selectionFuncton參數可以設定一函數用來在各個候選者中選擇特定的模型,共三個函數:
best函數簡單地選擇具有最好的某特定度量值的候選者,默認選項
oneSE函數選擇最好性能標準差之內的最簡單的候選者
Tolerance選擇某個用戶指定比例之內的最簡單的候選者
train函數的介紹可以參考我的另一個文章
caret包介紹學習之train函數介紹
建模預測之隨機森立
使用隨機森立進行分建模并進行預測
# 建模與預測之隨機森立 -------------------------------------------------------------- > > #使用5折交叉驗證的方法建立隨機森林模型,并選取在最好性能標準差之內最簡單的模型 > model_rf <- train(Class~.,data=train,mothed='rf', trControl=trainControl(method = 'cv',number = 5,selectionFunction = "oneSE")) > model_rf Random Forest 787 samples30 predictor2 classes: '0', '1' No pre-processing Resampling: Cross-Validated (5 fold) Summary of sample sizes: 629, 630, 630, 629, 630 Resampling results across tuning parameters:mtry Accuracy Kappa 2 0.9427961 0.885512516 0.9364589 0.872872830 0.9402725 0.8805043Accuracy was used to select the optimal model using the one SE rule. The final value used for the model was mtry = 2. > > #使用模型對test數據集進行預測 > pre <- predict(model_rf,test) > > #使用混淆矩陣查看預測效果 > table(pre,test$Class)pre 0 10 88 131 7 89 > > #查看各個變量對于模型的重要性 > plot(varImp(model_rf)) >建模預測之KNN算法
首先介紹關于KNN算法的介紹可以參考文章:
深入淺出KNN算法(一) KNN算法原理
模型評估
# 模型評估 -------------------------------------------------------------------- > > > #計算kappa值 > A <- as.matrix(table(pred_knn,test$Class)) > Apred_knn 0 10 91 121 4 90 > x <- sum(diag(A))/sum(A) > x [1] 0.9187817 > > y <- (sum(A[1,])*sum(A[,1]) + sum(A[2,])*sum(A[,2]))/(sum(A)*sum(A)) > y [1] 0.4991883 > > kappa <- (x-y)/(1-y) > > > > > kappa <- function(pre,class){ + A <- as.matrix(table(pre,class)) + + x <- sum(diag(A))/sum(A) + + + y <- (sum(A[1,])*sum(A[,1]) + sum(A[2,])*sum(A[,2]))/(sum(A)*sum(A)) + + + k <- (x-y)/(1-y) + return(k) + } > > #計算準確率,查全率,及kappa值 > > A <- as.matrix(table(pre,test$Class)) > Apre 0 10 88 131 7 89 > P_zq <- sum(diag(A))/sum(A) > P_zq [1] 0.8984772 > > p_cq <- A[2,2]/sum(A[,2]) > > k <- kappa(pre,test$Class) > results_rf <- c(P_zq,p_cq,k) > names(results_rf) <- c("準確率","查全率","kappa值") > results_rf準確率 查全率 kappa值 0.8984772 0.8725490 0.7971373 > > A <- as.matrix(table(pred_knn,test$Class)) > Apred_knn 0 10 91 121 4 90 > P_zq <- sum(diag(A))/sum(A) > P_zq [1] 0.9187817 > > p_cq <- A[2,2]/sum(A[,2]) > > k <- kappa(pre,test$Class) > results_knn <- c(P_zq,p_cq,k) > names(results_knn) <- c("準確率","查全率","kappa值") > results_knn準確率 查全率 kappa值 0.9187817 0.8823529 0.7971373 > > #從結果看knn的模型的準確率及查全率都要高一些所以knn模型的效果更好。 >總結
以上是生活随笔為你收集整理的机器学习案例-信用卡诈骗识别。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: esp8266 + 温湿度的vfd 时钟
- 下一篇: mapper method ......