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のカーネルは素晴らしいコンテンツですが、場合によっては最新の開発環境で動かないこともあるため、その際は自分でカスタマイズできる技術力も必要なんだな、と実感しました。
参考ページ
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などの特徴量がカテゴリ変数となっています。
以下のように、PClass、Sexを指定してone-hotエンコーディングすると、
- Pclass→Pclass_1, Pclass_2, Pclass_3
- Sex→Sex_female, Sex_male
のように列が更新され、1 or 0で表現できました。
ローカルで作成したJupyter NotebookファイルをGoogle Colaboratoryにアップロードし実行
ローカルで作成したJupyter Notebookファイルをそのまま
Google Colaboratoryにアップロードして使う方法です。
Colaboratoryのファイルメニューから"ノートブックをアップロード"を選択します。
"ファイルを選択"を選択すると、ファイルチューザーが開きます。
ローカルのNotebookファイルを選択します。
ファイルのアップロードに成功し、Colaboratoryで実行可能になります。
ローカルで実行していたNotebookの実行に時間がかかるため、Coraboratory上でGPUにて実行したかったので、この方法を探していました。
これで最初からColaboratoryでプロジェクト作成せずとも、気軽にNotebook作れますね!
機械学習の前処理"スケール変換"まとめ
概要
機械学習の前処理"スケール変換"についてまとめました。
以下を参考にしました。
Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎
- 作者: Andreas C. Muller,Sarah Guido,中田秀基
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/05/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
3.3 前処理とスケール変換
スケール変換とは
すべての特徴量を、ほぼ同じスケール(目盛り)に変換すること。
なぜ必要か
データの特徴量(説明変数)が複数ある場合、それらのスケールが異なると、スケールが大きい特徴量が強く効いてしまうため。
例えば、住宅価格を決める特徴量として、周辺の犯罪率(0.0 ~ 1.0)と、築年数(0~100年)がある場合、2つの特徴量を同列に扱うと、築年数の方がスケールが大きいため、強く効いてしまう。
スケール変換の例
以下に4つのスケール変換を示す。
変換方法は、⇒の右側に記載。
- StandardScale(標準化)⇒ 平均=0、分散=1
- MinMaxScaler(正規化) ⇒ 最小値=0、最大値=1
- RobustScaler(頑健化?) ⇒ 中央値=0、四方位数=1
- Normalizer(これも正規化?) ⇒ 特徴量ベクトルユークリッド長=1
サンプルコード
sklearnのload_breast_cancerデータを用いて、SVCに対して、
- 前処理なし
- MinMaxScaler
- StandardScaler
の3種類で計算しています。
結果としては、MinMaxScaler > StandardScaler > 前処理なし
の順番で精度が良かったです。前処理なしが圧倒的に精度が低く、何らかの前処理はやった方が良さそうですね!
AWS + djangoサイト構築にトライ
以下ではまりました。
aws-access-id, aws-secret-keyがわからない!
-------------------------------------------------------------------------------------
環境を作成し、Django アプリケーションをデプロイするには
-------------------------------------------------------------------------------------
そこで、以下のページを参考に、アクセスキーの作成。
こんな感じでユーザー作成に成功。
自分のPCから、以下のようにeb init成功しました。
しかし、そのあとのeb deployが失敗。。
その前のeb createでもエラーが出ていたような気がする。
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ソリューションのデータを用いたハンズオンを行いました。
ターゲットはある農家さんのデータで、「みどりクラウド」のセンサーを用いた以下のような カラムをもつ形式でした。
製品仕様・料金 | 温室内環境遠隔モニタリングシステム みどりクラウド
2~3人のグループに分かれたあと、上記のデータが約9か月分与えられて、各自分析したいテーマを決めて分析する、という自由度の高いハンズオンでした。
私たちのグループはnumpyやmatplotlibの経験がある人が少なく、私が一番知っているくらいのレベルでした。(私も勉強し始めてから3か月くらいです。。)
2時間程度で苦戦しながら、何とか以下のような、時系列での日射量と二酸化炭素の逆相関関係を表すことができました。
赤色が日射量で青色が二酸化炭素です。以下のことが想定されます。
ほかのグループでは、日射量データと気象庁の公開データを比較し、最小二乗誤差を利用してどの地域で取得したデータかを予想したり、関係がありそうなパラメータを2つ選んで2次元にプロットして傾向を調べたりとそれぞれの特色がありました。
最後に全員で一言ずつ感想を言って終わりました。
各自、着目点が異なり参考になった、という意見が多かったです。
短い時間でしたが、TFUG Utsunomiyaの雰囲気を知ることができたので良かったです。
また参加したいと思います。
100 numpy exercisesやってみた
松尾研究室の講座受講を目指して、
100 numpy exercisesやってみた。
100 numpy exercisesとは、、
その名の通り、Numpyの練習問題100選です。
難易度が1つ星から3つ星までの3段階で分かれている。
Numpy初心者の私には、1つ星でも十分難しい!
最初はimport文から始まるのだが、、、
開始数問でもう難しい。てか知らない。
この問題はNumpyのすごさを実感した。
こんな簡単にmatrix作れるとは!
この問題は、自分の回答と違っていた。
自分は、こう書いたんだけど、答えは一緒。
eye()とidentity()って何が違うんだ?
ドキュメントを確認したところ、
eye:対角線上に1をもち、他は0となる2次元配列を返す
identity:単位行列(identity array)を返す
同じ意味じゃね?
eyeの方が引数を多く取れるようなので、機能が少し多いのかな?
また気になった時に戻ってきて調べようと思います。
それにしても100 numpy exercises、なかなかやりごたえありそう。。!