タップできるもくじ
【kaggle入門】随時更新 よく使う前処理集
kaggleで与えられている学習データ、テストデータは、そのままではアルゴリズムに投入することができません。
文字列や欠損値を補完してあげる必要があるからです。
ここでは、アルゴリズムにかけるための最低限の前処理である「文字列のエンコード」や「欠損値の補完」、「外れ値の除外」など、基本的な内容を説明しています。
記事を書いた人
元営業という経歴を活かしながら、金融・製造・流通業のお客様を中心にAI活用コンサルや定着支援・人材育成の支援をしたり、講演や執筆活動など幅広く活動しています。
ヤエリ(@yaesuri_man)
普段のお客様との会話の中でよく話題に出るこのテーマ。
技術畑ではないものの、長らく現場の実務に携わってきた視点は喜ばれることが多いです。
「アルゴリズムにかけるための最低限の前処理」なので、精度については未考慮です。
プログラミング初心者である我々にとっては、submitできる状態に持っていくことが一つのハードル。
まずは最低限、
- 与えられたデータからモデルを構築する
- 構築したモデルで予測をして、submitするためのcsvを生成する
事に集中しましょう。
文字列のエンコード
あらかじめ与えられている学習データやテストデータは、データフレームとして読み込まれている前提です。
多くの場合「x_train」「x_test」という名前にしていると思いますので、それを前提とします。
とにかく文字列を数値にしたい場合
コーディング例は以下です。
cats = [] for col in x_train.columns: if x_train[col].dtype == 'object': cats.append(col) oe = ce.OrdinalEncoder(cols=cats, return_df=False) x_train[cats] = oe.fit_transform(x_train[cats]) x_test[cats] = oe.transform(x_test[cats])
列のtypeが「object」のものを全て数値にエンコードしています。
ここで説明しているエンコードの手法は「とにかく文字列をカテゴリに当てはめる方法(OrdinalEncording)」です。
同じ文字列は一つの同じ数値として、数値を割り振っていくものです。
当然、文字列と文字列の間の相関性や近さ、序列などの情報は失われてしまいます。
例として、
- 東京都
- 神奈川県
- 千葉県
- 埼玉県
- 鳥取県
- 島根県
というカテゴリ列だった場合、恐らく「東京都・神奈川県・千葉県・埼玉県」の4つは近しい関係、「鳥取県・島根県」の2つは近しい関係であり、この2つのセグメントは遠い関係であることが言えると思いますが、その関係性は考慮されません。
エンコードする数値を明示的に指定したい場合
- 「雨」を、「0」に
- 「曇り」を、「1」に
- 「晴れ」を、「2」に
というように、エンコードする数値を明示的に指定したい場合があります。
その場合のサンプルコードは以下です。
x_train = x_train.replace('雨', 0) x_train = x_train.replace('曇り', 1) x_train = x_train.replace('晴れ', 2) x_test = x_test.replace('雨', 0) x_test = x_test.replace('曇り', 1) x_test = x_test.replace('晴れ', 2)
※もっと簡略化して書くこともできますが、分かりやすいように冗長に記述しています。
「雨」「曇り」「晴れ」の3値はそれぞれ、「雨⇔曇り⇔晴れ」という関係性があります(雨と曇りは近く、雨と晴れは遠い)。
何も考えずにOrdinalEncordingやOne-Hot-Encordingするとこの特徴表現が失われてしまいますので、モデル精度向上のためには、上記の通り明示的(序列をつけて)に示してあげる必要があります。
欠損値の補完
これは幾つか方法がありますので、個別に説明していきます。
中央値で補完する場合
その列のmedianで埋めるやり方。無難な方法です。
x_train=x_train.fillna(x_train.median()) x_test=x_test.fillna(x_test.median())
ゼロで補完する場合(ゼロ埋め)
とりあえず、欠損値を全てゼロで埋めておくやり方です。
x_train.fillna(0) x_test.fillna(0)
一方で、空のカラムには意味があると考えた時に、ゼロではなく「9999」など、途方もない数値で置き換えておくやり方もあります。
x_train.fillna(9999) x_test.fillna(9999)
上記は全ての列について適用されてしまいますが、特定の列に対し、特定の値で埋めたい時は以下です。
x_train = x_train.fillna({'列名':'埋めたい文字'}) x_test = x_test.fillna({'列名':'埋めたい文字'})
何で埋めるのがベターか?については、元データによって異なります。
外れ値の除外
例えば、特徴量名「年齢」の値が18歳~200歳の範囲を取る場合、200については外れ値です。
200歳の人は現実的ではないので、異常値として除外する必要があります。
例えば「18歳以上、100歳未満の範囲に限定したい」場合のサンプルコードは以下です。
x_train = x_train[x_train['年齢'] >= 18] x_train = x_train[x_train['年齢'] < 100] x_test = x_test[x_test['年齢'] >= 18] x_test = x_test[x_test['年齢'] < 100]
【随時更新】kaggleでよく使う前処理集まとめ
前処理はかなり奥が深い世界です。
ここでは最もシンプルなエンコードと欠損値補完の方法を説明しましたが、今後気が向いたら他のエントリーも書いてみたいと思っています。
その他、pythonやkaggle、AI・機械学習といった記事のまとめはこちらです。
-
プログラミング関連の記事まとめ
続きを見る
ここからは、実際に私が購入し、おすすめできると思った本やオンラインスクールを紹介します。
機械学習のための「前処理」入門
まずはこちら。「機械学習のための『前処理』入門」です。
- これから機械学習を始めてみたい
- kaggleやSIGNATEにチャレンジしてみたい
という方には最適な本で、個人的には一番のおすすめです。
データモデルの精度向上には特徴量エンジニアリングが不可欠、というよりこれが全てと言っても過言ではありません。
各種環境準備の方法やコーディングの詳細に至るまで、誰にでも分かりやすく書かれています。
この一冊さえあれば、とりあえずkaggleにトライすることができます。
Udemy「みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習」
ベネッセが主催する、プログラミング未経験者を対象にしたコース。
数学や統計的な知識はそこそこに、文字通り人工知能と機械学習をゼロから学習できます。
受講生2万人以上、4千人以上の評価者から、5段階中4.0の評価を得ている、万人におすすめできる優良講座。
定価15,000円と高価ですが、90%OFFといったキャンペーンを頻繁に行っていますので、それを狙うのがおすすめ。
人工知能は人間を超えるか
pythonのコーディングからは離れますが、もしこの本を読んでいない人がいたら必ず一度は目を通しておいた方が良いです。
この界隈では有名な、東大の松尾豊先生の著書「人工知能は人間を超えるか」。
いわゆるAI・人工知能、機械学習といった昨今のキーワードを中心に、過去の歴史からここ最近の動き、今後の動向に至るまでを、平易な表現で丁寧に解説されています。
また日本ディープラーニング協会が開催する「ディープラーニング ジェネラリスト検定(通称:G検定)」の推薦図書の一つでもあります。
全てのビジネスマンにおすすめできる一冊。中古でもkindleでも構いませんので、これだけは目を通しておいた方が良いです。