機械学習: Label Encorder初心者向け

こんにちは。Arkです。

今回はLabel Encorderについて書きます。



- Label Encorderって?

objectとして蓄えられているデータを数値として書き換えることのできるライブラリです。

出会ったきっかけは、KaggleのチュートリアルであるTitanicというコンペの解説サイトを見ているときです。データを扱う上で、文字を数字(index)にして使用すると色々とうれしいことがあります。この解説サイトには

sklearnに入っているラベルエンコーダーを使うことにより、オブジェクトをカテゴリーの数値に変換することができます。

 とありました。一発で数字に変換できるってすごい...!となったので、どのような処理が行われているかわからなかったので調べてみました。



この解説サイトの2)の

# string label to categorical values
from sklearn.preprocessing import LabelEncoder

for i in range(train.shape[1]):
    if train.iloc[:,i].dtypes == object:
        lbl = LabelEncoder()
        lbl.fit(list(train.iloc[:,i].values) + list(test.iloc[:,i].values))
        train.iloc[:,i] = lbl.transform(list(train.iloc[:,i].values))
        test.iloc[:,i] = lbl.transform(list(test.iloc[:,i].values))

というコードを使って考えていきます。

ーーーーーーーーーーーーーーー

>>>for i in range(train.shape[1]):
iは存在する列の長さのレンジです。

>>> if train.iloc[:,i].dtypes == object:
もしi列目のデータタイプがobjectだった場合

>>> lbl = LabelEncoder()
>>> lbl.fit(list(train.iloc[:,i].values) + list(test.iloc[:,i].values))
i列目のobjectを訓練データとテストデータからリスト化します。
この時、内部ではある文字セット(例えば"sea","sky", ... )それぞれに0,1, ... という別の数字を割り振っています。
なお、数字の割り振り方は参考サイトによればこれは辞書順のようです。

>>> train.iloc[:,i] = lbl.transform(list(train.iloc[:,i].values))
>>> test.iloc[:,i] = lbl.transform(list(test.iloc[:,i].values))
.ilocを使ってtrain, testデータの中身を指定し、これまで文字だった部分を数字で置き換えています
ちなみに、.ilocの説明はこのサイトが分かりやすく、引用すると

DataFrameやSeriesの要素にアクセスする機能は、以下の4つが用意されています。
①loc, ②at, ③iloc, ④iat
それぞれ、loc, atは行や列の名前で要素へアクセスし、iがついているilocやiatは名前ではなくindex(NumPyの配列のように数字)でアクセスします。loc/ilocは複数要素をスライスすることができ、at/iatは一つの要素を取り出すことができます。

だそうです。
ーーーーーーーーーーーーーーー


いかがでしたか。
私を含む初心者の皆さんはこういった何気ないソースコードを読むのにも一苦労ですよね...

これからも学びをアウトプットして定着させつつ、初心者向けに書いていけたらなと思っています。
ありがとうございました。

機械学習: データの欠損を見える化する

こんにちは。Arkです。

今回はKaggleのチュートリアルの一つであるHouse Pricesのデータの欠損についてみてみました。欠損データを見える化する方法があってびっくりしました。初心者なりの驚きを提供できればと思います。

 

データの欠損って機械学習を行う上で必ず必要になってくるそうですね。確かに、集めたデータが完全なものであるのは体感的にあり得ない気がします。そこで今回は、欠損データを見える化する方法を書きます。

 

missingnoというモジュールは知っていますか?これが見える化を一瞬で行ってくれます。以下、
①一般的な欠損値を調べる方法
②missingnoを使った方法
の二本立てで書きます。


- 一般的な欠損値を調べる方法

まずはデータを読み込んで欠損が一つ以上あるデータを表示します。
データの読み込み方が分からない方はこちらを見てください。

import numpy as np
import pandas as pd
train = pd.read_csv('C:/Users/owner/Kaggle/HousePrice/train.csv')
print(train.isnull().sum()[train.isnull().sum()>0].sort_values())

三行目ではファイルを読み込み、四行目ではisnull().sum()というオプションを使って欠損データの個数を調べたのち、
欠損データ数が0個こより大きいものを抽出し、sortしています。

するとこうなります。

f:id:Ark11111:20200429232932p:plain
normal
これが、一般的な方法です(主観)


- missingnoを使った方法

これは、すごいです。

import numpy as np
import pandas as pd
import missingno as msno
train = pd.read_csv('C:/Users/owner/Kaggle/HousePrice/train.csv')

msno.matrix(df=train, figsize=(20,5), color=(0.5,0,0), labels=True)

七行目ではいろんな変数が入っていると思いますが、ここはmsno.matrix(train)だけでも大丈夫です。
色を付けて見やすくしているだけです。

f:id:Ark11111:20200429235807p:plain
missingno
するとこうなります。(上二行は無視してください><)

この白くなっている部分が欠損データの場所です。とても視覚的でわかりやすいですよね~~
ただしこれには欠点があり、ラベル数が増えると全部は表示されなくなるんですよね。加えてラベルがとても読みにくくなります。
欠損データの多い順にソートして表示する方法をご存知の上級者の方がいれば教えてください(o*。_。)oペコッ

今回はこんな感じです。ありがとうございました。

ファイルの読み込み(パスの指定方法)

こんにちは。Arkです。

僕みたいな初心者は、コードを見ながら勉強しても最初のファイルの読み込みで詰まってしまうことがあったので書いてみました。なお、一般的に書きすぎたので抽象的過ぎたらごめんなさいと先に謝っておきます。

 

  • パスの存在

パスって知っていますか?pass(道順)のことです。ファイルを指定するときは、このpass(道順)を示します。パスというものは二種類あり、相対パス絶対パスに分けられます。

今操作しているプログラム(tarminalだったりJupyter Notebookだったり)のファイルのある場所を起点としてpass(経路)を示す方法です。

rootディレクトリと呼ばれる一番大本を起点としてpass(経路)を指定する方法です。

 

 

私のような初心者はどちらか一方ができたらいいと思います。そこでお勧めするのは絶対パスです。なぜなら、簡単だからです。以下では絶対パスの書き方について書きます。より詳しく知りたい人は「相対パス 絶対パス 違い」みたいな感じで検索してください。

 

 

絶対パスの書き方を紹介します。このページにたどり着いたということは、何かのファイルを読み込もうとしていますよね?おそらくそのファイルはダウンロードしてきたものだと思います。今回説明するために、画像のようなtest.csvファイルというものを用意しました。

f:id:Ark11111:20200429225312j:plain

testファイル

この赤い矢印の場所を見てください。PC>ダウンロードとなっていますよね?

つまりtest.csvファイルというのはPCの中のダウンロードフォルダの中に存在していることを示しています。このPCというものは、Cドライブというフォルダのユーザーフォルダのオーナーフォルダに入っています。これは、別のアカウントでログインしたときにダウンロードフォルダがアカウントごとに異なるようにするためです。まあ細かいことは置いておいて以下、このファイルの指定方法を書きます。

 

読み込みたいフォルダは"C:/Users/owner/Downloads/test.csv"と書けば読み込めます。

終わりです。

(補足)

一般的に書こうとした挙句、終わり方が適当になってしまったので一応私の困ったバージョンで具体的に書きます。

 

Python3を使って機械学習を行うときに、訓練データとテストデータを読み込む必要がありました。そこで、

test = pd.read_csv("C:/Users/owner/Downloads/test.csv")として読み込みました。

 

 

一人で始めるKaggle

 お久しぶりです。Arkです。

最近大学4年生に進級いたしまして、ついに研究室に配属されました!!!

しかしコロナの影響で、少なくとも夏までは研究室どころか大学にすら入れません。

まあ、時間を持て余しても仕方がないのでKaggleを始めてみました。

 

例のごとく、超初心者向けです。

 

  • Kaggleの始め方

まずはPythonを使えるように開発環境を整えないといけません。私は「やさしいPython」という本の最初に書いてあったJupyter Notebookというものをインストールして使っています。Jupyter Notebookと検索して出てくる一番上のサイトに書いてありますが、「Jupyter notebook ご存知ですか? 知ってますよね?そう、機械学習やらPython周りのイケてるエンジニアが使っているアレです。」とのことなので、これをインストールすれば間違いないです。ちなみにこれは、インタラクティブ形式なので一行ずつコードを実行することができてとても便利です!JupyterNotebookの画面をプログラマーっぽくする方法についてもブログを書いたので、良ければご覧ください。

 

  • アカウントを作る

こちらからアカウントを作りましょう。

 

  • 入門用のとっても簡単な問題に挑戦してみよう

とても簡単な問題の一つに、「Titanic」というのがあります。そう、あの有名なタイタニック号をモチーフにした問題です。客の名前や性別といったデータを分析して誰が生きるか?死ぬか?を予測するものです。楽しそう。

 

  • 実際にやってみよう

このブログを見ながらやってみてください(丸投げ)。とてもまとまっています。

 

初心者の私ならではの疑問と解説をしていこうと思います。上記のブログと照らし合わせながらお読みください。

 

疑問例

  1. CSV格納先のディレクトリってどうやって指定するんだ??
  2. Numpyってなんだい?
  3. Pandasってなに
  4. isnull()ってなに。どうやって使うの
  5. 木を作った後にpd.DataFrame(A,B,column=...)っていろんな変数出てきたけどなに
  6. 二つ目の木で出てくるDecisionTreeClassifier(.....)の変数って何。どういう意味

 

とまあ、色々と出てきてしまいました...色々調べたので解説していきます。

 

  1. これは私がOneDriveにファイルを突っ込んでやろうとしていたのでできませんでした(たぶんできると思うんですけどわからないので教えてください)。とりあえず動いたらいいと思ったので、Cドライブの中にKaggleというファイルを作りました。コードはこんな感じで書きました。

     train = pd.read_csv("C:/Kaggle/train.csv")
    test = pd.read_csv("C:/Kaggle/test.csv")

  2. NumpyとはPythonにおいて数値計算を効率的にしてくれるものだそうです。便利グッズぐらいの認識でいいのかなと。
  3. PandasとはPythonにおいてデータ解析を支援するものだそうです。これも便利グッズ!
  4. isnull()というのは、Pandasのライブラリに入っている欠損を見つけるものです。こちらにうまくまとまってました。
  5. DataFlameは二次元配列の一種だそうです。こちらがとても分かりやすかったです。
  6. 木を作るときに色々と条件を設定するようです。初期設定は中々ダメな感じになっているので。変更すると過学習を防げるようです。こちらが分かりやすかったです。

 

 

以上でKaggle入門を終わりたいと思います。結構長い文章になっちゃいました。

いや~~私もようやくAIの領域に踏み入れたんだな~と喜んでいます。これからも初心者目線から何か書いていけたらなと思っています。読了ありがとうございました。

 

追記:

こちらをみて改良したところ、scoreが0.80382となり、向上しました。

 

JupyterNotebookのテーマ,フォント設定とコードの折り畳み

こんにちは。Arkです。

今日はJupyterNotebookの初期設定について書きます。背景を黒くしてフォントを格好良くしたいですよね!

 

初心者にとって初期設定や環境設定はとても面倒で、プログラミングを始める前にやる気がそがれる要因ナンバーワンといっても過言ではないものになっています。なので、何も考えずにコピーして貼り付けてください。

 

Jupyter Notebookをネットからダウンロードしたら

  1. Anaconda Promptを開く
  2. pip install jupyterthemes と入力+Enter
  3. jt -t monokai -f inconsolata -N -T と入力+Enter

 

以上で終わりです。

 

軽く解説をしておくと、2ではJupyterNotebookのテーマの変更できるようにしています。3では、monokaiという文字色のテーマを指定し、inconsolataというフォントを選択しています。この両者は、プログラマーが最も慣れ親しんでいるフォントらしいので他のフォントを探したりせずコピペすればいいと思います。ほかの色も気になる人はこちら。また,ツールバーとノート名を表示するために -N -T をつけています。

 

コードを折りたためるようにするとコーディングが楽なので,こちらのサイトからやってみてください.

 

簡単ですね~!

初心者一ヶ月!2019基本情報技術者試験の感想

どうも、とてもお久しぶりです。

Arkです。

 

一応先に言っておくと、僕はAtCorderという競技プログラミングに触ったことがあるくらいでそれ以外の情報の知識は皆無のずぶずぶの素人なのでそういった方の参考になると幸いです。

さて、今日というかブログを書いているうちに昨日になったんですが基本情報技術者試験を受けて、自己採点では合格していたので本番の感想を書いていきます。(追記: 合格していました)

ちなみに本番までの勉強時間は80時間ほどでした。内容は気が向いたら⇒

ark11111.hatenablog.com

のページを更新するかもしれません。

 

 

試験当日 (試験会場まで)

朝早くに起きていざ試験会場へ!!...なんてことはなく、前日に飲み会があったため良質な睡眠がとれず(三時間ごとに目が覚めます)重たい目をこすりながら起床しました(7:30)。最難関といわれる起床試験合格です。眠いな~~と思いながらも一応試験なので受験表と筆記用具と腕時計を持ったことを確認して、朝ご飯を食べるために近くのコーヒーやさんでモーニングをしました(8:50)。試験はお昼を挟むためお弁当と飲み物を購入し、試験会場へ行きました(9:15)。

とても驚いたことに、僕の試験教室には女性受験者が二割ほどいました。(いつからIT業界はこんなに華やかになったんだ...)

 

試験当日 (午前試験)

9:30に試験開始ですが、一応15分前から諸々の注意事項を説明されるのでこの時間には着いていた方がいいと思います。

 

試験時間は150分有りますが60分を過ぎると退出可能です。すらすら解けば60分で解けます。僕は試験途中におなかを壊してトイレに行く+急に鼻血が出るのダブルコンボだったので90分ほどかかってしまいましたが笑

 

問題内容ですが、僕が受けた試験から数学チックな問題が増えるらしいと聞いたので(((https://www.ipa.go.jp/about/press/20190124.html の "理数能力を重視し、線形代数、確率・統計等、数学に関する出題比率を向上" より)))

どんなものかと思って取り組んだんですが、ほとんど過去問と同じでした。

ちゃんと過去問演習を積んでいれば簡単だと思います。

 

結論: 午前は過去問で7割くらい取れていれば受かりそう。

 

 

 

試験当日 (昼休み)

一緒に受ける友達は残念ながら違う試験場になってしまい、お昼は一人で過ごしました。二時間くらいツイッターしてました。おわり。

 

 

 

試験当日 (午後試験)

正直、午後試験が基本情報試験の最も難しい試験だと思います。過去問演習しようにも同じ問題は出ないので対策のしようがありません。僕は対策できないなら勉強しなくていいやと思って過去問を一回分しか解いてなかったので正直とても不安でした。

 

試験時間は午前と同じく150分ですが、一方途中退出は40分後からでした。これは問題文を見て投げたす人がいるからだと思います。

一応時間配分だけは考えていて、必須の第1問(15分)、選択問題(15分x4)、必須の第8問(40分)、言語選択の第9問C言語(30分)、見直し(5分)の予定でした。ちなみに選択問題はどれを選ぶか考えていませんでした。

 

午後試験は運で乗り越えようと思っていたにもかかわらず、ふたを開けてみると、技術の問題ではなくほとんど読解の問題に感じたため手ごたえはとてもありました。長い文章の中にヒントが散りばめられていたので、日本人なら解けると思います(^▽^)/危なかったのは読解にてまどり、第1問に25分を費やしてしまったことぐらいでした。

ちなみに選択問題では、大問2,5,6,7を選択しました。なぜなら、大問3はSQLで大問4はネットワークの問題で情報系に疎い僕には難しそうに感じたからです。

 

結果: なんか85%ぐらいありました。

 

 

さいごに

さて、振り返ってみるととてもコスパのいい資格のような気がしてきました。是非皆さんも受験してみてはいかがでしょうか。