質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

4回答

3004閲覧

機械学習の分類で、ラベルが間違っていたら?

kururi10

総合スコア27

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2018/04/08 13:27

ランダムフォレストで分類をしているのですが、
良いものを1・悪いものを0とラベリングして学習させるとします。

この時、
人の目で見て1とラベリングしていたのに
悪いものである0が1割ほど含まれていました。
(人が間違ってラベリングしていたとする)

悪いものであるのに1と教え込まれたわけですが、
少数の間違ったラベリングのデータを
ランダムフォレストはどのように解釈するのでしょうか?

悪いものであるのに1と教え込まれたデータは
正しくラベリングされたものの中の1割なので
頻度的には少ない例外とみなし
特徴をそこまで学習しないようになるのか、

それとも
1割の少数のものと考えずに
あくまで1と見なして特徴をとらえようとするのか
どちらなのでしょうか?

やりたいこととしては、
悪いものであるのに1と教え込まれたとしても
(間違ってラベリングされたものが含まれていたとしても)

その割合が低いのであれば
その特徴を無視するか
重要度を下げるような学習の仕方を
してほしいと思っています。

ご回答のほど宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

「garbage in, garbage out」なので上手くいかない可能性が高いです。

データクレンジングすることが重要と思われます。


https://qiita.com/smurakami/items/14202a83bd13e55d4c09

うまく外れ値として処理することができればよいのですが、非構造データに対しては困難だと思います。


正則化を入れることによって緩和されます。
その分精度も落ちます。
ノイズによる精度落ちと、正則化による精度落ちの競合になります。

投稿2018/04/08 13:48

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kururi10

2018/04/08 15:38 編集

あ、mkgreiさん、お久しぶりです^^ 早速のご回答ありがとうございます! RANSACですか~。 以前書籍に載っていて、ちらっとしか読んでいなかったので 1から勉強してみます。 臨時のモデルを作って当てはめてみるのですね。 これって、XGBoostやLightGBMのように 修正を次に反映していくイメージですかね。。。 正則化については精度落ちの兼ね合いを考慮しながら という感じにならざるを得ないということなんですね。 あれから相変わらず株価の分析をしていますが、 現在の状況はこんな感じになっています ↓ ------------------------------------------- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 訓練データでの精度確認 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ------------------------------------------- 【confusion matrix】 [[2901 71] [ 0 1585]] ------------------------------------------- 【classification report】   precision  recall  f1-score  support 0   1.00  0.98  0.99  2972 1  0.96  1.00   0.98  1585 avg / total 0.99  0.98   0.98   4557 ------------------------------------------- 【accuracy】 0.984419574281 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 検証データでの精度確認 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ------------------------------------------- 【confusion matrix】 [[428 315] [191 206]] ------------------------------------------- 【classification report】   precision   recall   f1-score  support 0  0.69  0.58  0.63  743 1  0.40  0.52  0.45  397 avg / total 0.59  0.56  0.57  1140 ------------------------------------------- 【accuracy】 0.556140350877 目指すものは、 適合率の方の精度を上げることです。 僕の印象として検証データでの精度がまだまだに感じるのですが、 mkgreiさんの目から見て この結果も「garbage in, garbage out」ぽい印象でしょうか?
R.Shigemori

2018/04/08 22:26

mkgreiさん RANSACは面白いですね。sklearnに実装されているのもいいところです。ただ、sklearnのモジュールは回帰が対象で識別が見あたりません。ご存じでしたら、在る場所を教えてもらえないでしょうか? 自力で実装できそうな感じもするのですが、回帰と識別は例外値・異常値の定式化が異なること、ノンパラメーター系の方法(ディシジョンツリーなど)の仮想モデルの設定方法がわからないこと、などがあるので、既存モジュールに頼りたいと思っています
mkgrei

2018/04/08 23:27

kururi10さん、お久しぶりです。 テストデータのスコアと乖離しているのが気になります。 過学習の兆候です。 金融データの場合、正味の変動よりノイズの方が大きいので、あまり学習できないのが一般的なような気がします。 その中で正しく評価できれば0.001のようなわずかな差でも長期的には利益を上げられる構造だったかと思います。
kururi10

2018/04/09 13:25 編集

R.Shigemoriさん 僕はRANSACとはというところから調べていたので まだそこまでいっていないのですが、 sklearnのものは回帰が対象なのですか・・・。
kururi10

2018/04/09 13:26 編集

mkgreiさん ご回答いただき、ありがとうございます! やはり過学習でしたか^^; 平均損失:平均利益が1:2なので 勝率は50%でも十分だと考えているので なんとかそこまで持っていければいいなと思っています。 ちなみに上記の精度での勝率は、38%ぐらいでした。 ランダムフォレストのパラメタは n_estimators = 1000 max_depth = 19 max_features = 20 min_samples_split = 2 min_samples_leaf = 1 random_state = 0 class_weight = {0:1,1:6} でして、 特徴量の数は 5701です。 特徴量がこれだけあるのに、 max_depthが19しかなくていいのだろうかと 疑問です。。。 max_depthを上げていくと、class_weightの数も上げていかないと バランスが取れないんですが、 max_depthが200ぐらいになっても 精度は大きくは上がってこない感じです^^;
mkgrei

2018/04/09 13:32

R.Shigemoriさん、kururi10さん sklearnにはRANSACの回帰しかないようですね。 回帰を分類に読み直してゴリ押すことも考えますが、 KFoldで分類器を一度踏み台にして分類確率を出してやって、正解クラスからの差分をyとして捉え直すことによって回帰問題に緩和することも考えられます。
mkgrei

2018/04/09 13:58

kururi10さん n_estimators = 1000 max_depth = 19 max_features = 20 あたりがモデルの表現力を決めていて、他はどっちかというと過学習防止だったような記憶です。 GridSearchCVのようなものでハイパーパラメータを網羅的にふってみてはいかがですか? 教師データに対してすでに過学習しているのでdepthを深くすると更に過学習するかと… https://www.analyticsvidhya.com/blog/2015/06/tuning-random-forest-model/ https://towardsdatascience.com/hyperparameter-tuning-the-random-forest-in-python-using-scikit-learn-28d2aa77dd74
kururi10

2018/04/10 11:51

mkgreiさん ご回答ありがとうございます! RANSACは分類確率を経由させることで 回帰としてうまくとらえられるのですね。 これの少し前のモデルでパラメタサーチをしていたのですが、 max_depthが10や20未満で果たして特徴を捉えられているのかな・・・ ともやもやしたものがありました。 5000以上の特徴量は 移動平均の変化などが含まれるので、 その多くを使って木の分岐を作る必要があるんじゃないかな とイメージしていました。 トレーダーは、こうなってこうなってこうなる、みたいな 多くの値の変化をざっくり見ているので 木を深くしてたくさんの特徴量を考慮に入れないと とばかり思っていました。 ですが、mkgreiさんの 「depthを深くすると更に過学習する」 という一言を聞いて、はっとしました。 確かにそれ以上進めるとますます過学習になっちゃいますよね・・・ トレーダーが見ているところから 考えていたので、 過学習とmax_depthの関係をきちんと把握しないまま 進めていました^^; 凄く助かりました。ありがとうございます! ちなみに、mkgreiさんは 今まで金融系データを学習させたことはありましたか?
mkgrei

2018/04/10 13:40

金融系データは移動平均が重要だった記憶があります。 ほとんどノイズなので、過学習しているとすぐにモデルがだめになってしまいます。
kururi10

2018/04/11 12:40

移動平均ですか~。 確かに、始値や高値などを特徴量に入れずに 移動平均だけにすると精度が上がった経験が僕にもありました。 やはり細かな上げ下げはノイズであることが多いのですね。 ご回答いただき、ありがとうございました^^
guest

0

どこまで一般的に拡大解釈できるかはともかくとして、こういう感じになるようです。

Classifier comparison — scikit-learn 0.19.1 documentation

間違ったラベルの付けられた点の「近く」に正しいラベルの点がある程度の個数存在していれば、よしなに取り扱ってくれることも期待できるかもしれません。

投稿2018/04/08 20:57

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kururi10

2018/04/09 13:14

ご回答ありがとうございます。 なるほど、その領域が正しいラベルでざっくりと占められていたら 間違ったラベルもその領域の一部として解釈してくれる可能性もある という感じなんですね。 無視したりペナルティを与えたりというよりも 無難に解釈するというイメージですか。。。
guest

0

教師あり学習は、与えられたデータに対して忠実に学習するものなのでそのデータに誤りがあってもそのまま学習していきます。質問のランダムフォレストのような性能の高めなものだとその傾向が強いので例外っぽいデータであってもラベルに忠実な答えとなります。

うまい対応策は、学習データと試験データの分類と試験の工夫があり得るかと思います。
学習時のデータは、クリーンなもの(誤っているものを含まないデータのみで構成されるもの)とし、試験データは、それ以外(つまり誤っているものを含む)とします。試験の際は、ラベルが誤っているものがうまく誤識別することを含めた評価をすることで期待した結果が得られるモデルを作ることができます。
ただし、上記アプローチは付与されているラベルが何らかの方法で誤っていることがわかっている場合に限られます。一応、質問の記載上、「人の目で見て1とラベリングしていたのに悪いものである0が1割ほど含まれていました」とあるので、この方法でうまくいくと思われます。
「総数の1割程度に誤りがあることはわかっているがどれかはわからない」という場合は、別のアプローチが必要になります。

投稿2018/04/08 18:21

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kururi10

2018/04/09 13:01

ご回答いただきまして、ありがとうございます! なるほど、誤りもそのまま学習されてしまうのですね。 ランダムフォレストならなおさらということで、 しっかりと対応していく必要があるのですね。 あ、そうですね、 誤りがどれであるか分かるというニュアンスにも解釈できますね。 自分としては、「総数の1割程度に誤りがあることはわかっているがどれかはわからない」 の方を考えていました。 わかりにくい質問ですみませんでした^^;
guest

0

人間の想像しない、「何か」を学習してしまいます。

機械学習怖い話 - Qiita

投稿2018/04/08 14:48

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kururi10

2018/04/08 15:34

ご回答ありがとうございます。 「何か」を学習ですか・・・ 確かにそこは言語化できないものですよね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問