teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

本来行いたかった質問へ変更しました。

2019/11/13 20:32

投稿

SyunSyun
SyunSyun

スコア24

title CHANGED
@@ -1,1 +1,1 @@
1
- 機械学習:特徴量数の調整
1
+ 機械学習:特徴量数を一つずつ加えて精度が上がるときにだけ、そ特徴量を採用したい。
body CHANGED
@@ -1,13 +1,14 @@
1
1
  機械学習初心者です。
2
2
  現在取り組んでいる課題に500sampleで63個程度の特徴量の2項分類問題があります。
3
+ 機械学習においては特徴量の数は多ければ多いほど良いことが多いことは理解していますが、本当にそうなのか確認したいと思いました。
3
- の50個の特徴量の内から、カラムの2番目3番目4番目の3だけ取り出した場合の精度(ROC_AUC)たいのですが、「X has 3 features per sample; expecting 63」エラーが出てしまいます。
4
+ こで63個の特徴量の内から、「特徴量12,3、、63と一ずつ加えていき、精度(ROC_AUC)が低下か上がらなければprintで『特徴量Xは精度に貢献ません』とアラームを出す。」というプログラミングを書きたいと思っていますが、エラーが出てしまいます。
4
- どこが直すと3つのみの特徴量を選択した場合の精度が出力できるか、指摘していただけると幸いです。
5
+
5
- ダミーdfは、
6
+ このダミーデータフレームは、
6
7
  https://github.com/yamanaka1/dammy2
7
8
  に置いてあります。
8
9
 
10
+ こうするとうまくいくかも、、というアドバイスありましたら大変ありがたいです。
9
11
  ```python
10
-
11
12
  import numpy as np
12
13
  import pandas as pd
13
14
  from sklearn.linear_model import LogisticRegression
@@ -15,21 +16,38 @@
15
16
  from sklearn.metrics import roc_curve
16
17
  from sklearn.metrics import roc_auc_score
17
18
 
18
- X = df1.iloc[:, [1,2,3]]
19
- y = df1.iloc[:,-1]
19
+ AUC = [0.5]
20
20
 
21
+ for a in np.arange(2,64,1):
22
+ X = df1.iloc[:, 1:a]
23
+ y = df1.iloc[:,-1]
24
+
21
- lr = LogisticRegression(C = 0.1, class_weight='balanced', random_state=0)
25
+ lr = LogisticRegression(C = 0.1, class_weight='balanced', random_state=0)
26
+
27
+ X_train, X_test, y_train, y_test = train_test_split(
28
+ X, y, test_size=0.2, random_state=0)
29
+ lr.fit(X_train, y_train)
30
+ cv_scores_train = cross_val_score(lr, X_train, y_train, cv = 3)
31
+ probs = lr.predict_proba(X_test)
32
+ probs2 = probs[:, 1]
33
+ auc = roc_auc_score(y_test, probs2)
34
+
35
+ if auc > AUC(-1):
36
+ print('AUC: {:.2f}'.format(auc))
37
+ AUC.append(auc)
38
+ else:
39
+ print('特徴量{}は精度に寄与しません'.format(a))
40
+ ```
22
41
 
42
+ ここでエラーは以下の様にでます。
43
+ TypeError Traceback (most recent call last)
44
+ <ipython-input-56-8bf996652a36> in <module>()
23
- X_train, X_test, y_train, y_test = train_test_split(
45
+ 22 auc = roc_auc_score(y_test, probs2)
46
+ 23
47
+ ---> 24 if auc > AUC(-1):
24
- X, y, test_size=0.2, random_state=0)
48
+ 25 print('AUC: {:.2f}'.format(auc))
49
+ 26 AUC.append(auc)
25
50
 
26
- lr.fit(X_train, y_train)
27
- cv_scores_train = cross_val_score(clf, X_train, y_train, cv = 3)
51
+ TypeError: 'list' object is not callable
28
52
 
29
- probs = clf.predict_proba(X_test)
30
- probs2 = probs[:, 1]
31
-
32
- auc = roc_auc_score(y_test, probs2)
33
- print('AUC: {:.2f}'.format(auc))
34
- ```
35
- アドバイスを頂けると大変ありがたいです。
53
+ listではよくないとありますが、アドバイスを頂けると大変ありがたいです。

1

ダミーデータフレームを追加しました。

2019/11/13 20:32

投稿

SyunSyun
SyunSyun

スコア24

title CHANGED
File without changes
body CHANGED
@@ -2,14 +2,18 @@
2
2
  現在取り組んでいる課題に500sampleで63個程度の特徴量の2項分類問題があります。
3
3
  その50個の特徴量の内から、カラムの2番目、3番目、4番目の3つだけ取り出した場合の精度(ROC_AUC)をしりたいのですが、「X has 3 features per sample; expecting 63」エラーが出てしまいます。
4
4
  どこが直すと3つのみの特徴量を選択した場合の精度が出力できるか、指摘していただけると幸いです。
5
+ ダミーdfは、
6
+ https://github.com/yamanaka1/dammy2
7
+ に置いてあります。
5
8
 
9
+ ```python
10
+
6
11
  import numpy as np
7
12
  import pandas as pd
8
13
  from sklearn.linear_model import LogisticRegression
9
14
  from sklearn.model_selection import train_test_split, cross_val_score
10
15
  from sklearn.metrics import roc_curve
11
16
  from sklearn.metrics import roc_auc_score
12
- from sklearn.metrics import confusion_matrix
13
17
 
14
18
  X = df1.iloc[:, [1,2,3]]
15
19
  y = df1.iloc[:,-1]
@@ -26,4 +30,6 @@
26
30
  probs2 = probs[:, 1]
27
31
 
28
32
  auc = roc_auc_score(y_test, probs2)
29
- print('AUC: {:.2f}'.format(auc))
33
+ print('AUC: {:.2f}'.format(auc))
34
+ ```
35
+ アドバイスを頂けると大変ありがたいです。