質問編集履歴

5

タイトルの修正

2022/05/12 12:50

投稿

nats
nats

スコア16

test CHANGED
@@ -1 +1 @@
1
- Rでxgboostでモデルを作ってSHAP値を算出したいです
1
+ RでSHAP値を算出したいです
test CHANGED
File without changes

4

コードの整理,加筆

2022/05/12 12:48

投稿

nats
nats

スコア16

test CHANGED
File without changes
test CHANGED
@@ -1,27 +1,9 @@
1
1
  ### 前提
2
2
 
3
3
  プログラミングと分析は独学なので,間違っている箇所やわかりにくい箇所があるかもしれません。ご容赦ください。
4
- Rを使ってxgboostでモデルを作り,SHAP値を算出,図示(=結果を図で出力したいと思っています。**xgboostでモデルを作るところまでは(多分)できましたが,図示するところで躓いています**。ご助力のほどどうぞよろしくお願いいたします。
4
+ SHAP値を算出,図示(=結果を図で出力したいと思っています。ご助力のほどどうぞよろしくお願いいたします。
5
5
 
6
6
  ```R
7
- #パッケージ読み込み
8
- library(dplyr); library("SHAPforxgboost");
9
- library("ggplot2"); library("xgboost");
10
- library("data.table"); library("here");
11
- library("Matrix"); library("farff");library("OpenML")
12
-
13
- #irisデータのSpeciesを目的変数にする
14
- iris <- dplyr::mutate(iris, Species = str_replace_all
15
- (Species , pattern = c("setosa" = "0", "versicolor" = "1","virginica" = "2")))
16
-
17
- #データフレームをxgb.DMatrix()関数でDMatrix形式にする
18
- df.train.dt <- data.table(df.train,keep.rownames=F)
19
- df.test.dt <- data.table(df.test,keep.rownames=F)
20
- model.data.mx <- sparse.model.matrix(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, df.train.dt)
21
- model.data.dm <- xgb.DMatrix(model.data.mx,label=df.train.dt$Species)
22
- pre.data.mx <- sparse.model.matrix(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, df.test.dt)
23
- pre.data.dm <- xgb.DMatrix(pre.data.mx,label=df.test$Species)
24
-
25
7
  #XGBoostパラメータ(デフォルト値)
26
8
  params <- list(
27
9
  eta=0.3,
@@ -41,7 +23,7 @@
41
23
  booster="gbtree", nrounds=100, verbose=1) #目的変数yyyは2値(0, 1)です~~
42
24
 
43
25
  xgb.result <- xgb.train(params=params, data=model.data.dm, label=df.train.dt$Species,
44
- num_class=3, objective="multi:softprob", booster="gbtree", nrounds=100, verbose=1)
26
+ num_class=3, objective="multi:softprob", booster="gbtree", nrounds=100, verbose=1)#irisデータのSpeciesを目的変数にする
45
27
 
46
28
  #評価
47
29
  pred <- predict(object=xgb.result,newdata=pre.data.dm)
@@ -53,7 +35,7 @@
53
35
 
54
36
  ### 実現したいこと
55
37
 
56
- -SHAP値を算出,結果を図で出力したいです。具体的には「Feature Importance」「dependence plot」「summary plot」を出力したいです。
38
+ -SHAP値を算出,結果を図で出力したいです「Feature Importance」「dependence plot」「summary plot」
57
39
 
58
40
  ### 発生している問題・エラーメッセージ
59
41
 

3

ミスの修正

2022/05/12 10:33

投稿

nats
nats

スコア16

test CHANGED
File without changes
test CHANGED
@@ -17,8 +17,6 @@
17
17
  #データフレームをxgb.DMatrix()関数でDMatrix形式にする
18
18
  df.train.dt <- data.table(df.train,keep.rownames=F)
19
19
  df.test.dt <- data.table(df.test,keep.rownames=F)
20
- options(na.action='na.omit')
21
- options(na.action='na.pass')
22
20
  model.data.mx <- sparse.model.matrix(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, df.train.dt)
23
21
  model.data.dm <- xgb.DMatrix(model.data.mx,label=df.train.dt$Species)
24
22
  pre.data.mx <- sparse.model.matrix(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, df.test.dt)

2

ミスの修正

2022/05/12 10:32

投稿

nats
nats

スコア16

test CHANGED
File without changes
test CHANGED
@@ -13,15 +13,6 @@
13
13
  #irisデータのSpeciesを目的変数にする
14
14
  iris <- dplyr::mutate(iris, Species = str_replace_all
15
15
  (Species , pattern = c("setosa" = "0", "versicolor" = "1","virginica" = "2")))
16
-
17
- #データの分割
18
- set.seed(123)
19
- df.rows = nrow(iris)
20
- train.rate = 0.8
21
- train.index <- sample(df.rows,df.rows * train.rate)
22
- df.train = iris[train.index,] #訓練データ
23
- df.test = iris[-train.index,] #テストデータ
24
- cat("train =",nrow(df.train),"test= ",nrow(df.test))
25
16
 
26
17
  #データフレームをxgb.DMatrix()関数でDMatrix形式にする
27
18
  df.train.dt <- data.table(df.train,keep.rownames=F)

1

架空データでなくirisデータに置き換えた

2022/05/12 10:20

投稿

nats
nats

スコア16

test CHANGED
File without changes
test CHANGED
@@ -10,15 +10,28 @@
10
10
  library("data.table"); library("here");
11
11
  library("Matrix"); library("farff");library("OpenML")
12
12
 
13
+ #irisデータのSpeciesを目的変数にする
14
+ iris <- dplyr::mutate(iris, Species = str_replace_all
15
+ (Species , pattern = c("setosa" = "0", "versicolor" = "1","virginica" = "2")))
16
+
17
+ #データの分割
18
+ set.seed(123)
19
+ df.rows = nrow(iris)
20
+ train.rate = 0.8
21
+ train.index <- sample(df.rows,df.rows * train.rate)
22
+ df.train = iris[train.index,] #訓練データ
23
+ df.test = iris[-train.index,] #テストデータ
24
+ cat("train =",nrow(df.train),"test= ",nrow(df.test))
25
+
13
26
  #データフレームをxgb.DMatrix()関数でDMatrix形式にする
14
27
  df.train.dt <- data.table(df.train,keep.rownames=F)
15
28
  df.test.dt <- data.table(df.test,keep.rownames=F)
16
29
  options(na.action='na.omit')
17
30
  options(na.action='na.pass')
18
- model.data.mx <- sparse.model.matrix(yyy ~ x1 + x2 +x3, df.train.dt)
31
+ model.data.mx <- sparse.model.matrix(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, df.train.dt)
19
- model.data.dm <- xgb.DMatrix(model.data.mx,label=df.train.dt$yyy)
32
+ model.data.dm <- xgb.DMatrix(model.data.mx,label=df.train.dt$Species)
20
- pre.data.mx <- sparse.model.matrix(yyy ~ x1 + x2 +x3, df.test.dt)
33
+ pre.data.mx <- sparse.model.matrix(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, df.test.dt)
21
- pre.data.dm <- xgb.DMatrix(pre.data.mx,label=df.test$yyy)
34
+ pre.data.dm <- xgb.DMatrix(pre.data.mx,label=df.test$Species)
22
35
 
23
36
  #XGBoostパラメータ(デフォルト値)
24
37
  params <- list(
@@ -34,13 +47,16 @@
34
47
  alpha=0
35
48
  )
36
49
  #XGBoost
37
- xgb.result <-xgb.train(params=params, data=model.data.dm,
50
+ ~~xgb.result <-xgb.train(params=params, data=model.data.dm,
38
51
  label=df.train.dt$yyy, num_class=3, objective="multi:softmax",
39
- booster="gbtree", nrounds=100, verbose=1) #目的変数yyyは2値(0, 1)です
52
+ booster="gbtree", nrounds=100, verbose=1) #目的変数yyyは2値(0, 1)です~~
53
+
54
+ xgb.result <- xgb.train(params=params, data=model.data.dm, label=df.train.dt$Species,
55
+ num_class=3, objective="multi:softprob", booster="gbtree", nrounds=100, verbose=1)
40
56
 
41
57
  #評価
42
58
  pred <- predict(object=xgb.result,newdata=pre.data.dm)
43
- table(pred,df.test.dt$yyy)
59
+ table(pred,df.test.dt$Species)
44
60
 
45
61
  #結果の出力
46
62
  shap_values <- shap.values(xgb_model = xgb.result, X_train = pre.data.dm)
@@ -53,15 +69,14 @@
53
69
  ### 発生している問題・エラーメッセージ
54
70
 
55
71
  ```
56
- Error in `colnames<-`(`*tmp*`, value = c(colnames(X_train), "BIAS")) :
72
+ Error in table(pred, df.test.dt$Species) :
57
- 次元が 2 未満オブジェクトに 'colnames' を設定しようとしした
73
+ 全て引数は同じ長さでなければなりせん
58
74
  ```
59
75
 
60
76
  ### 該当のソースコード
61
77
 
62
78
  ```R
63
- #結果の出力
64
- shap_values <- shap.values(xgb_model = xgb.result, X_train = pre.data.dm)
79
+ table(pred,df.test.dt$Species)
65
80
  ```
66
81
 
67
82
  ### 試したこと