こけこっこー

がんばる

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 を使うと行と列を指定してデータを切り出す事ができます。 行・列番号または行・列ラベルで切る取る対象を指定可能です。

以下の記事が詳しかったです。 記事にある通り、lociloc で指定する方法もあります。

ailaby.com

次に、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 にどんな値が含まれるかを確認するためにやっているだけなので、 処理としては不要です。 ただ、確認しておくことで manmale を一緒に扱う必要がある場合などに気づけます。

2行目がワンホットエンコーディングの処理です。 get_dummies() を使うだけでよしなにやってくれます。

3行目は結果の出力です。処理としては不要です。

出力

f:id:monisoi:20171013083436p:plain

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()

出力結果

f:id:monisoi:20171012082643p:plain

head()の引数に数字を与えてやればその分の行数が表示されます。

カンバンでプライベートタスク管理

先日友人がプライベートでカンバンアプリを使っているのを見て、面白そうだと思い 自分も便乗してみました。

使用しているアプリ

Trelloを使っています。

trello.com

会社ではJootoというサービスを使っているのですが、プライベートでは違うものを と思いTrelloにしました。 どちらも使い勝手としては同じという印象です。

使い方

一般的なカンバンの使い方をしています。

ToDo, Doing, Done のリストを作成し、ToDoにタスクを追加していきます。 手をつけ始めたらDoing、終わったらDoneです。

ゴミ捨てとか洗濯とか、そういった家事タスクから、専門書をどこまで読む といったスキルアップタスクまでとにかくリストに追加します。

本を読む系のタスクだと章区切りでタスクにしてやると、短期間でDoneにタスクを 送れるので個人的にはやる気が出ます。

感想

プライベートでもタスクがはっきりとしている方がメリハリがつく気がします。 家事に対しても、タスクを放置せずに片付けようという気が起きたり起きなかったり。

Youtubeを使って学習効率を上げる

友人と一緒にYoutubeで動画配信やってます。
テック系の話題中心で、気になった技術を紹介しています。

www.youtube.com

モチベーション

  • 最新の技術に触れたい
  • 自分の活動を公開したい

最新の技術に触れたい

IT業界の技術は日々ものすごい速さで更新されていくので、実際に触れてみてインスピレーションを受けたり、開発に取り入れたりしたいものです。自分の引き出しが多くなります。

自分の活動を公開したい

自分の活動を公開することは現代のITエンジニアにとっては必須です。なんてったってこれで毎日食べていくための仕事が得られるかもしれないんですから。

友人と動画配信することのメリット

  • 一方的に人に説明できる
  • 勉強会で登壇者になっても平然を装える
  • 強制力がある
  • 認識共有できる

一方的に人に説明できる

人に説明しようと思ったらきちんと知識を身につけなければなりません。 勝手に説明相手を作って勝手に話せるというのは良い学びになると思います。

勉強会で登壇者になっても平然を装える

余裕です。普段から世界に向けて喋ってるんですから。(たぶん)

強制力がある

一人でやるとモチベーションを長続きさせるのが大変ですが、人とやると自分から辞めるとは言い出しづらく、結構続きます。 強制力って大事。

認識共有できる

一人で勉強して動画配信しようと思ったら、自分がしゃべろうとしている内容が果たして本当に正しいのか確証が得られず、二の足を踏んでしまいがちです。しかし、人と打ち合わせができると、自分の理解が正しいことを確認できたり、間違いに気づけたり、理解が深まったりします。そういった機会が得られることは非常に大きいと感じます。

最後に

というように、テック系Youtuberも学びや情報発信の一つの形だと思います。 実際いろんな技術に触れる機会を作れるのは非常に有意義なのでおすすめです。