pandasでデータフレームから特徴量とターゲットの配列を切り出す
機械学習アルゴリズムにデータを入れていざ学習させよう、というときには当たり前ですが データフレームの形式のままでは無理です。 データフレームから特徴量とターゲット(正解)を配列として切り出してやる必要があります。
まずpandas.DataFrame
で作られたデータフレーム df
があるとします。
A, Bが特徴量でCがターゲットとしましょう。
A B C 0 a b c 1 a b c 2 a b c
特徴量を切り出すには以下のようにします。
features = df.ix[:, 'A':'B'] X = features.values
pandas.DataFrame.ix
を使うと行と列を指定してデータを切り出す事ができます。
行・列番号または行・列ラベルで切る取る対象を指定可能です。
以下の記事が詳しかったです。
記事にある通り、loc
や iloc
で指定する方法もあります。
次に、pandas.DataFrame.values
を使うとデータフレームからラベルを除いたデータだけの配列を取得することができます。
つまり、X
は以下のようになります。
[['a' 'b'] ['a' 'b'] ['a' 'b']]
この調子でターゲットも切り出しましょう。
y = df['C'].values
以下のようになります。
['c' 'c' 'c']
ちなみに特徴量 X
が大文字なのは行列だから、 y
が小文字なのはベクトルだから、慣習的にこのように書くようです。
pandasでデータフレームに対しパラメータを追加・削除する
データフレームに列や行を追加したかったら concat()
、削除したかったら drop
を使います。
やってみましょう。
まず適当なデータフレームを作っておきます。
import pandas as pd import numpy as np df = pd.DataFrame(np.array([['a','b','c'], ['a','b','c'], ['a','b','c']]), columns = list("ABC"))
こんな感じになります。
A B C 0 a b c 1 a b c 2 a b c
追加するようのデータも作っておきましょう
df_concat = pd.DataFrame(np.array(['d','d','d']), columns = list("D"))
Dの列を作りました
D 0 d 1 d 2 d
さて、df
にDの列を追加してみましょう。
df = pd.concat((df, df_concat),axis=1)
axis=1
はこの場合列方向の削除を示します。
axis=0
だと行方向です。
期待通りDの列が追加されました。
A B C D 0 a b c d 1 a b c d 2 a b c d
Dを削除してみましょう。
df = df.drop('D', axis=1)
削除もできました。
A B C 0 a b c 1 a b c 2 a b c
pandasでワンホットエンコーディング
機械学習ではしばしばデータの解析を容易にするためにワンホットエンコーディングという手法を使います。
例えば「性別」というパラメータがあればその中には「男性」や「女性」が含まれますが、 この「性別」を分解して「男性」「女性」をそれぞれ一つのパラメータとしてしまい、値を0, 1で表現するのが ワンホットエンコーディングです。
これはpandasで以下のように簡単にできます。
print(df_train.Sex.value_counts()) sex_dummy = pd.get_dummies(df_train.Sex) sex_dummy.head()
1行目のprint()は Sex
にどんな値が含まれるかを確認するためにやっているだけなので、
処理としては不要です。
ただ、確認しておくことで man
や male
を一緒に扱う必要がある場合などに気づけます。
2行目がワンホットエンコーディングの処理です。
get_dummies()
を使うだけでよしなにやってくれます。
3行目は結果の出力です。処理としては不要です。
出力
pandasでデータの欠損を確認する
機械学習において収集したデータを使おうと思ったとき、ほとんどのケースでデータに欠損があります。 そんなときは、もっともらしい値で穴埋めをするなどの対処が必要ですが、 それより前にどのパラメータのデータがどれだけ欠損しているかを確認したいです。
pandasなら以下のようにしてパラメータごとのデータ欠損数を出力することができます。 (サンプルのデータにはkaggleのtitanic問題を使わせていただいてます)
Titanic: Machine Learning from Disaster | Kaggle
import pandas as pd df_train = pd.read_csv("train.csv") df_train.isnull().sum()
出力
PassengerId 0 Survived 0 Pclass 0 Name 0 Sex 0 Age 177 SibSp 0 Parch 0 Ticket 0 Fare 0 Cabin 687 Embarked 2 dtype: int64
isnull()
で欠損確認をして sum()
で合計です。
pandasが思った以上に簡単にやりたいことを実現してくれるのでビビります。
pandasを使ってcsvの先頭を表形式でjupyterに出力する
kaggleの問題に取り組んでいるときなど、jupyter上でぱぱっとcsvの中身を見れると便利。
例えばタイタニックの生存予測のトレーニングデータcsvの中身を見たいとき
Titanic: Machine Learning from Disaster | Kaggle
以下のようなコードで表形式に表示できる
import pandas as pd df_train = pd.read_csv("train.csv") df_train.head()
出力結果
head()の引数に数字を与えてやればその分の行数が表示されます。
カンバンでプライベートタスク管理
先日友人がプライベートでカンバンアプリを使っているのを見て、面白そうだと思い 自分も便乗してみました。
使用しているアプリ
Trelloを使っています。
会社ではJootoというサービスを使っているのですが、プライベートでは違うものを と思いTrelloにしました。 どちらも使い勝手としては同じという印象です。
使い方
一般的なカンバンの使い方をしています。
ToDo, Doing, Done のリストを作成し、ToDoにタスクを追加していきます。 手をつけ始めたらDoing、終わったらDoneです。
ゴミ捨てとか洗濯とか、そういった家事タスクから、専門書をどこまで読む といったスキルアップタスクまでとにかくリストに追加します。
本を読む系のタスクだと章区切りでタスクにしてやると、短期間でDoneにタスクを 送れるので個人的にはやる気が出ます。
感想
プライベートでもタスクがはっきりとしている方がメリハリがつく気がします。 家事に対しても、タスクを放置せずに片付けようという気が起きたり起きなかったり。
Youtubeを使って学習効率を上げる
友人と一緒にYoutubeで動画配信やってます。
テック系の話題中心で、気になった技術を紹介しています。
モチベーション
- 最新の技術に触れたい
- 自分の活動を公開したい
最新の技術に触れたい
IT業界の技術は日々ものすごい速さで更新されていくので、実際に触れてみてインスピレーションを受けたり、開発に取り入れたりしたいものです。自分の引き出しが多くなります。
自分の活動を公開したい
自分の活動を公開することは現代のITエンジニアにとっては必須です。なんてったってこれで毎日食べていくための仕事が得られるかもしれないんですから。
友人と動画配信することのメリット
- 一方的に人に説明できる
- 勉強会で登壇者になっても平然を装える
- 強制力がある
- 認識共有できる
一方的に人に説明できる
人に説明しようと思ったらきちんと知識を身につけなければなりません。 勝手に説明相手を作って勝手に話せるというのは良い学びになると思います。
勉強会で登壇者になっても平然を装える
余裕です。普段から世界に向けて喋ってるんですから。(たぶん)
強制力がある
一人でやるとモチベーションを長続きさせるのが大変ですが、人とやると自分から辞めるとは言い出しづらく、結構続きます。 強制力って大事。
認識共有できる
一人で勉強して動画配信しようと思ったら、自分がしゃべろうとしている内容が果たして本当に正しいのか確証が得られず、二の足を踏んでしまいがちです。しかし、人と打ち合わせができると、自分の理解が正しいことを確認できたり、間違いに気づけたり、理解が深まったりします。そういった機会が得られることは非常に大きいと感じます。
最後に
というように、テック系Youtuberも学びや情報発信の一つの形だと思います。 実際いろんな技術に触れる機会を作れるのは非常に有意義なのでおすすめです。