質問編集履歴
2
本来行いたかった質問へ変更しました。
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
機械学習:特徴量数の
|
1
|
+
機械学習:特徴量数を一つずつ加えて精度が上がるときにだけ、その特徴量を採用したい。
|
body
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
機械学習初心者です。
|
2
2
|
現在取り組んでいる課題に500sampleで63個程度の特徴量の2項分類問題があります。
|
3
|
+
機械学習においては特徴量の数は多ければ多いほど良いことが多いことは理解していますが、本当にそうなのか確認したいと思いました。
|
3
|
-
そ
|
4
|
+
そこで63個の特徴量の内から、「特徴量1、2,3、、、63と一つずつ加えていき、精度(ROC_AUC)が低下か上がらなければprintで『特徴量Xは精度に貢献しません』とアラームを出す。」というプログラミングを書きたいと思っていますが、エラーが出てしまいます。
|
4
|
-
|
5
|
+
|
5
|
-
ダミー
|
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
|
-
|
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
|
-
|
45
|
+
22 auc = roc_auc_score(y_test, probs2)
|
46
|
+
23
|
47
|
+
---> 24 if auc > AUC(-1):
|
24
|
-
|
48
|
+
25 print('AUC: {:.2f}'.format(auc))
|
49
|
+
26 AUC.append(auc)
|
25
50
|
|
26
|
-
lr.fit(X_train, y_train)
|
27
|
-
|
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
ダミーデータフレームを追加しました。
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
|
+
アドバイスを頂けると大変ありがたいです。
|