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

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

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

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

Q&A

解決済

3回答

371閲覧

python2.7で機械学習する時において、学習データの正例と負例を1:1になるように、調整する方法が分からず、苦慮しております。

akakage13

総合スコア89

Python 2.7

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

0グッド

1クリップ

投稿2017/07/03 11:37

python2.7で競馬のデータを用いて、機械学習を勉強しております。
学習データにおきまして、正例と負例の偏りが大きいと上手く考えないため、学習データの負例を間引いて、正例と負例を1:1になるように、調整する方法が分からず、苦慮しております。

こちらが、自力で作ったソースコードでございます。

# -*- coding: utf-8 -*- import numpy as np import pandas as pd import random # 表示する行数を設定 pd.options.display.max_rows=5 #訓練データ jockey = pd.read_csv("pre_jockey1.csv" , sep=",") # 特徴データとラベルデータを取り出す jockey_except_arrival = jockey.drop("arrival", axis=1) features = jockey_except_arrival.as_matrix() targets = jockey['arrival'].as_matrix() jockey.loc[random.sample(jockey.index, 5)] print jockey.loc[random.sample(jockey.index, 5)]

pre_jockey1.csv の中身はこちらでございます

season weather race_num distance baba horse_weight arrival 6 1 10 1800 1 466 0 6 2 1 1400 1 472 0 6 1 2 1200 1 502 1 6 1 6 1800 2 452 0 6 1 1 1200 2 468 0 5 1 10 1400 1 486 0 5 1 5 1200 1 520 0 5 1 7 1400 1 462 0 5 1 4 1600 1 490 0 5 1 12 1800 1 466 1 5 1 6 1800 1 512 0 5 1 5 1200 1 486 0 5 1 2 1800 1 498 0 5 1 12 1200 1 488 0 5 1 7 1200 2 472 0 5 1 11 1200 1 480 0 5 1 2 1800 1 500 0 5 2 12 1800 1 468 0 5 2 3 1900 1 452 0 4 1 3 1800 1 520 0 4 1 1 1800 1 472 0 4 2 7 1200 2 474 0 4 2 5 1600 1 462 0 4 1 3 1200 1 416 0 4 1 2 1800 1 476 0 4 1 1 1200 1 484 0 4 1 12 1400 1 468 0 4 1 3 1900 2 456 0

上記のcsvファイルの行数が例えば、おおよそ700行あるといたします。

自力のソースコードは、おおよそ700行の中から、正例も、負例も考えず、ただ、5サンプルランダムに抽出し、printしただけのものでございます。

競馬データでございますので、少し説明いたしますと、目的変数のarrivalは3着以内なら 1 4着以下なら 0 にしております。

正例が 1 、負例が 0 としますと、当然ながら、負例の 0 が多くなります。

ここから、発展させまして、ファイルの中の正例、つまり 1 の行数を読み取り、 その行数と同じ行数の負例をランダムに抽出して、

正例:負例 = 1:1 に調整する、 そして作成したデータを、別の例えば horse_1 と名づけた、CSVファイルに保存する。

これらの作業を行ってくれるソースコードが分からず、苦慮しております。

先輩方の御教示、よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

それは、一般には UnderSamplingと呼ばれます。

imbalanced-learnを使うと簡単そうですね。

また、不均衡データにおけるsampling が参考になりそうです。

投稿2017/07/03 17:47

編集2017/07/03 17:51
MasashiKimura

総合スコア1150

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

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

akakage13

2017/07/06 19:42

MasashiKimura様、御教示、ありがとうございました。 小生の環境はpython2.7のレガシーのため、pip install -U imbalanced-learn が出来ない状況でございます。只今、pyrhon3系用に、もう一台、ノートを増設中でございます。 環境が整いましたら、imbalanced-learnを試してみる予定でございます。 今後とも、よろしくお願いいたします。
guest

0

テストデータと学習データで分ける方法は以下でよくやりますので、それを応用すれば比較的簡単に分けられると思います。

X 変数が入ったデータ、
Y 正解ラベルが入ったデータ、とすると、

python

1from sklearn.model_selection import train_test_split 2X_train, X_test, Y_train, Y_test = train_test_split(X, Y, train_size=0.5)

で1:1に分けていくというのが学習データとテストデータで分ける一例です(もっと細分化することもあります)。

単に2個に分けるだけなら、最初からCSVを2つ作っておいて、2回CSVを読み込むというのも良いかもしれませんね!

投稿2017/07/03 13:38

k_mawa82

総合スコア234

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

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

akakage13

2017/07/06 19:36

k_mawa82様、御教示ありがとうございました。 今後とも、よろしくお願いいたします。
guest

0

個人的な意見ですが、
目的変数と説明変数を工夫するべきだと思います。
変に間引いても、予測するデータでは負例が多いわけですから。

機械学習の勉強ということですが、勉強がメインであるのであれば、もっと分かりやすい題材がたくさんあります(アヤメの花等)。いきなり競馬の予想をするというのは勉強になるとは思えません。

一度こちらを読まれてはいかがでしょう?
機械学習をこれから始める人に押さえておいてほしいこと

投稿2017/07/03 11:47

編集2017/07/03 11:48
_Victorique__

総合スコア1392

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問