sklearn.cross_validation.KFoldをsklearn.model_selection.KFoldに置き換えた話

背景

kaglleのTitanicで投票数が2番目のカーネルの写経をしていたところ、 カーネルで使っているsklearn.cross_validation.KFoldが、 最新のsklearnで使えなくなっており、コンパイルエラーになってしまいました。 その代わりにsklearn.model_selection.KFoldを使うよう置き換えた話です。

オリジナルソース

ソースコード量が多いので、ポイント以外は省略します。

from sklearn.cross_validation import KFoldn

...省略

train = train.shape[0]

ntest = test.shape[0]

SEED = 0 # for reproducibility

NFOLDS = 5 # set folds for out-of-fold prediction

kf = KFold(ntrain, n_folds=NFOLDS, random_state=SEED)

...省略

 for i, (train_index, test_index) in enumerate(kf):

...省略

修正後

from sklearn.model_selection import KFold ←sklearn.cross_validationをsklearn.model_selectionに変更

...省略

train = train.shape[0]

ntest = test.shape[0]

SEED = 0 # for reproducibility

NFOLDS = 5 # set folds for out-of-fold prediction

kf = KFold(n_splits=NFOLDS, shuffle=False, random_state=SEED) ←コンストラクタの引数が変わる

...省略

for i, (train_index, test_index) in enumerate(kf.split(train)): ←クラス自体をイテレータとして使うやり方から、splitメソッドを使うやり方に変更

...省略

無事、コンパイルエラー解消しました!

おわりに

kaggleのカーネルは素晴らしいコンテンツですが、場合によっては最新の開発環境で動かないこともあるため、その際は自分でカスタマイズできる技術力も必要なんだな、と実感しました。

参考ページ

segafreder.hatenablog.com

one-hotエンコーディング

概要

one-hotエンコーディングについて学習したので、共有します。

one-hotエンコーディングとは

機械学習を使う際の前処理の1つです。

たとえば"性別"という特徴量は、男/女の2種類の値をもちます。 これをカテゴリ変数と呼びます。

しかし値が文字になっているため、そのままだと機械学習の学習器に入れることができません。 そのため、以下のように、"オリジナルの特徴量"_"値"で新しくヘッダを作り、値を1 or 0で表現することで、 機械学習の学習器に入れることが可能となります。 この新しく1 or 0で表現する方法を、one-hotエンコーディングといいます。

性別_男 性別_女
1 0
0 1

実装方法

私の知っている限り、実装方法は以下の2種類があります。 1.pandasのget_dummysを使う方法 2.scikit-learnのOneHotEncoderを使う方法

今回はpandasのget_dummysを使う方法を説明します。

pandasのget_dummysを使う方法

公式ドキュメント pandas.get_dummies — pandas 0.23.4 documentation

pandasのget_dummysは、one-hotエンコーディングするデータ(Series or DataFrame)が必須の引数です。

import pandas as pd

data = pd.read_csv("train.csv");

pd.get_dummys(data)

とすれば、データがエンコーディングできます。 特徴量がすべてカテゴリ変数とは限らないので、エンコーディングする特徴量を選択したい場合が多いと思います。

その場合、以下のように特徴量のヘッダ名をリストで定義し、 get_dummys関数にオプション引数で与えることで、エンコーディングする特徴量を選択できます。

ohe_columns = ['Country', 'Sex']

pd.get_dummys(data, columns=one_columns)

使用例(Titanicデータを使って説明)

Titanicデータを使った場合の使用例です。 Train.csvを読み込んだままでは、PclassやSexなどの特徴量がカテゴリ変数となっています。 f:id:riodeja5:20181202231053p:plain

以下のように、PClass、Sexを指定してone-hotエンコーディングすると、 f:id:riodeja5:20181202231808p:plain

  • Pclass→Pclass_1, Pclass_2, Pclass_3
  • Sex→Sex_female, Sex_male

のように列が更新され、1 or 0で表現できました。

ローカルで作成したJupyter NotebookファイルをGoogle Colaboratoryにアップロードし実行

ローカルで作成したJupyter Notebookファイルをそのまま

Google Colaboratoryにアップロードして使う方法です。

 

Colaboratoryのファイルメニューから"ノートブックをアップロード"を選択します。 

f:id:riodeja5:20181123230105p:plain

 

"ファイルを選択"を選択すると、ファイルチューザーが開きます。

f:id:riodeja5:20181123230547p:plain

 

ローカルのNotebookファイルを選択します。

f:id:riodeja5:20181123230859p:plain

 

ファイルのアップロードに成功し、Colaboratoryで実行可能になります。

f:id:riodeja5:20181123231512p:plain

 

ローカルで実行していたNotebookの実行に時間がかかるため、Coraboratory上でGPUにて実行したかったので、この方法を探していました。

これで最初からColaboratoryでプロジェクト作成せずとも、気軽にNotebook作れますね!

 

機械学習の前処理"スケール変換"まとめ

概要

機械学習の前処理"スケール変換"についてまとめました。

 

以下を参考にしました。

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

 

 3.3 前処理とスケール変換

 

スケール変換とは

すべての特徴量を、ほぼ同じスケール(目盛り)に変換すること。

なぜ必要か

データの特徴量(説明変数)が複数ある場合、それらのスケールが異なると、スケールが大きい特徴量が強く効いてしまうため。

例えば、住宅価格を決める特徴量として、周辺の犯罪率(0.0 ~ 1.0)と、築年数(0~100年)がある場合、2つの特徴量を同列に扱うと、築年数の方がスケールが大きいため、強く効いてしまう。

スケール変換の例

以下に4つのスケール変換を示す。

変換方法は、⇒の右側に記載。

  1. StandardScale(標準化)⇒ 平均=0、分散=1
  2. MinMaxScaler(正規化) ⇒ 最小値=0、最大値=1
  3. RobustScaler(頑健化?) ⇒ 中央値=0、四方位数=1
  4. Normalizer(これも正規化?) ⇒ 特徴量ベクトルユークリッド長=1

サンプルコード

sklearnのload_breast_cancerデータを用いて、SVCに対して、

  • 前処理なし
  • MinMaxScaler
  • StandardScaler

の3種類で計算しています。

結果としては、MinMaxScaler > StandardScaler > 前処理なし

の順番で精度が良かったです。前処理なしが圧倒的に精度が低く、何らかの前処理はやった方が良さそうですね!

 

gist5b075a3f1f3f2ae70864905160bbbdc4

AWS + djangoサイト構築にトライ

AWS + djangoサイト構築にトライしてみました。

以下のAWS公式チュートリアルページを実施

docs.aws.amazon.com

 

以下ではまりました。

aws-access-id, aws-secret-keyがわからない!

-------------------------------------------------------------------------------------

環境を作成し、Django アプリケーションをデプロイするには

  1. eb init コマンドで EB CLI リポジトリを初期化します。

-------------------------------------------------------------------------------------

  

そこで、以下のページを参考に、アクセスキーの作成。

docs.aws.amazon.com

 

こんな感じでユーザー作成に成功。

f:id:riodeja5:20181104091213p:plain

 

自分のPCから、以下のようにeb init成功しました。

f:id:riodeja5:20181104091918p:plain

 

しかし、そのあとのeb deployが失敗。。

その前のeb createでもエラーが出ていたような気がする。

 

f:id:riodeja5:20181104172918p:plain

eb init -p python-2.7 django-tutorial

チュートリアルではとすべきところを、

eb init -p python-3.6 django-tutorial

とpython3.6指定にしたのがダメだったかな?

プロジェクト作成からやり直そうかな。

 

 

TFUG Utsunomiya #15 ハンズオンに参加しました

TFUG Utsunomiyaは初参加でした。

宇都宮大学で以前からやっていることは知っていて、参加したいとは思っていたので、今回参加できて良かったです。

https://tfug-utsunomiya.connpass.com/event/100789/

 

株式会社セラクの方が来てくださり、「みどりクラウド」という農業に使うIOTソリューションのデータを用いたハンズオンを行いました。

https://midori-cloud.net

 

ターゲットはある農家さんのデータで、「みどりクラウド」のセンサーを用いた以下のような カラムをもつ形式でした。

f:id:riodeja5:20180930193947p:plain

製品仕様・料金 | 温室内環境遠隔モニタリングシステム みどりクラウド

 

2~3人のグループに分かれたあと、上記のデータが約9か月分与えられて、各自分析したいテーマを決めて分析する、という自由度の高いハンズオンでした。

私たちのグループはnumpyやmatplotlibの経験がある人が少なく、私が一番知っているくらいのレベルでした。(私も勉強し始めてから3か月くらいです。。)

2時間程度で苦戦しながら、何とか以下のような、時系列での日射量と二酸化炭素の逆相関関係を表すことができました。

f:id:riodeja5:20180930194445p:plain

赤色が日射量で青色が二酸化炭素です。以下のことが想定されます。

  • 日射量が増加すると、二酸化炭素光合成に使われるため減少する
  • 日射量が減少すると、その逆

ほかのグループでは、日射量データと気象庁の公開データを比較し、最小二乗誤差を利用してどの地域で取得したデータかを予想したり、関係がありそうなパラメータを2つ選んで2次元にプロットして傾向を調べたりとそれぞれの特色がありました。

 

最後に全員で一言ずつ感想を言って終わりました。

各自、着目点が異なり参考になった、という意見が多かったです。

 

短い時間でしたが、TFUG Utsunomiyaの雰囲気を知ることができたので良かったです。

また参加したいと思います。

 

100 numpy exercisesやってみた

松尾研究室の講座受講を目指して、

100 numpy exercisesやってみた。

 

100 numpy exercisesとは、、

その名の通り、Numpyの練習問題100選です。

難易度が1つ星から3つ星までの3段階で分かれている。

Numpy初心者の私には、1つ星でも十分難しい!

 

f:id:riodeja5:20180919235836p:plain

最初はimport文から始まるのだが、、、

開始数問でもう難しい。てか知らない。

 

この問題はNumpyのすごさを実感した。

こんな簡単にmatrix作れるとは!

f:id:riodeja5:20180920000348p:plain

 

この問題は、自分の回答と違っていた。

f:id:riodeja5:20180920001405p:plain

自分は、こう書いたんだけど、答えは一緒。

f:id:riodeja5:20180920001622p:plain

eye()とidentity()って何が違うんだ?

ドキュメントを確認したところ、

 eye:対角線上に1をもち、他は0となる2次元配列を返す

 identity:単位行列(identity array)を返す

 

同じ意味じゃね?

eyeの方が引数を多く取れるようなので、機能が少し多いのかな?

また気になった時に戻ってきて調べようと思います。

 

それにしても100 numpy exercises、なかなかやりごたえありそう。。!