データアナリストもLinuxについて学んでみる

はじめに

もともとデータアナリストとして働いているのですが、最近、エンジニアと一緒に仕事をすることが増えたので、良いとされている教科書を読むなどしています。その中で、『新しいLinuxの教科書』がわかりやすく書かれていたので、今回はそこで出てきたコマンドたちを箇条書きにして忘備録としておきたいと思います。なのでいつもよりショボいです。
普段、Rをメインとして機械学習・クローリング目的でPythonを扱うものとしては、エンジニア寄りの知識が薄いなぁと課題に感じていたので、これを良い機会と思ってCLIへの耐性を付けていきたいと思います。

感想

分析業務において、仮想環境でCentOSやUbuntuを扱うことはあるのですが、分析環境を作った上で、クローリング業務・RPAシステムなどのスケジュール実行をするくらいで基礎からちゃんと勉強したわけではありませんでした。そのため、教科書には知らないコマンドもありました。
この本はLinuxを使って開発する際の作法(移植性大事、GUI使うな、十字キー使うな)から、歴史的なコマンドの変遷、シェルスクリプトを用いた作業の効率化、Gitなどのチーム開発ツールの紹介まで幅広く扱われていて十分な内容だと思いました。図による解説もあるので、普段R使っているような非エンジニアでも読めるはずです。これからエンジニアと一緒に分析業務をしていくデータアナリストの方には強くおすすめできる本だと思います。Rでの当たり前の機能が、Linuxのシェルで普通にあるんだと色々と学びがありました。

コマンドたち

date

現在の日時の表示

echo

文字列の表示

pwd

現在のディレクトリを確認

cd

カレントディレクトリの変更

ls

ディレクトリ内のファイルの表示、オプションでパターン指定も可能

mkdir

ディレクトリを作成する、pオプションで深い階層も一気に作れる

touch

ファイルを作成する

rm

ファイル・ディレクトリを削除する

rmdir

空のディレクトリを削除する

cat

ファイルを表示する

less

ファイル内容をスクロール表示する

cp

ファイル・ディレクトリをコピーする

mv

ファイル・ディレクトリを移動する

ln

ファイルにリンクを張る

find

ディレクトリツリーからファイルを探す

locate

ファイル名データベースからファイルを探す(高速)、何日か前のファイルを探すの適している。

which

コマンドのフルパスを表示する

alias

エイリアスの設定(わかりやすい別名を与える)

set

bashのオプションを切り替える

shopt

bashのオプションを切り替える(種類豊富)

PATH

コマンド検索パス

printenv

環境変数の表示

export

環境変数の設定

sudo

コマンドをスーパーユーザとして実行

ps

プロセスの表示(x, ux, ax, aux, auxww)

jobs

現在のジョブ一覧を表示

fg

ジョブをフォアグラウンドにする(入力受付状態にする)

bg

ジョブをバックグラウンドにする

kill

ジョブ・プロセスを終了させる

|

パイプライン(処理と処理をつなぐ)
R使いからするとRのdplyrでパイプ処理を知ったので、Linuxに普通にあるのを知れて新鮮な気分になった。

head

先頭の部分を表示
こちらもRでよく使うものですね。

du

指定したファイルやディレクトリの使用容量を表示する

wc

入力ファイルの行数・単語数・バイト数を数える

sort

行単位でテキストを並び替える

uniq

同じ内容の行を省く

cut

入力の一部を切り出して出力する(元データから特定の部分を抽出したい際など)

tr

入力の文字を置き換える・削除もできる(-d)

tail

ファイルも末尾部分を表示する

diff

二つのファイルの差分を表示する

grep

文字列を検索する

sed

テキストの編集を元ファイルを変更せずに行える

awk

テキストの検索や抽出・加工などの編集操作を行う(sedより高機能で、スクリプトは「パターン」と「アクション」からなる)
・列選択もできる
 ・CSVファイルからのスコア集計などもできる。
 ・あんちべさんの本『データ解析の実務プロセス入門』でも紹介されていた。

xargs

標準入力として引数のリストを与える(findやgrepとの組み合わせで使うことが多いらしい)

tar

ファイルをアーカイブファイルにまとめたり、アーカイブファイルから元のファイルを取り出したりする

gzip

ファイルを圧縮・展開する(一つのファイルしか圧縮できないのでtarとの併用を行う)

bzip2

gzipよりも高い圧縮率で圧縮を行うが、gzipよりも圧縮・展開に時間がかかる

zip

アーカイブと圧縮を同時に行う(多くのディストリビューションで標準インストールされていない。unzipも必要)

git

ファイル変更履歴を保存し管理するツール
 ・git init リポジトリを作成
 ・git add コミット対象として登録
 ・git commit コミットする
 ・git status ワークツリーの状態を表示
 ・git diff 差分を表示する
 ・git log 履歴を表示する
 ・git revert コミットを取り消す
 ・git branch ブランチの一覧表示、新しくブランチを作成
 ・git checkout ブランチを切り替える
 ・git merge 指定したブランチを現在のブランチにマージする
 ・git branch -d ブランチを削除する
 ・git push 変更の履歴を送る
 ・git clone リポジトリを複製する
 ・git remote add リポジトリパスに別名を設定する
 ・git fetch 他のリポジトリの変更を取り込む

yum

パッケージ管理(CentOS)
 ・yum install パッケージのインストール
 ・yum erase/remove パッケージのアンインストール、削除
 ・yum search パッケージの検索
 ・yum info パッケージの詳細情報を表示

apt

パッケージ管理(Ubuntu)
 ・sudo apt-get install パッケージのインストール
 ・sudo apt-get remove パッケージの削除
 ・sudo apt-get purge 設定ファイルも含めた完全削除
 ・apt-cache search パッケージを検索

ssh

リモートログインする

info

オンラインマニュアルを表示する(索引や階層構造を設定できるなどmanより充実)

参考文献

新しいLinuxの教科書

LIMEで赤ワインのデータをいじってみる with Python

はじめに

2018年1月のTokyoR( TokyoR67に行ってきました )で機械学習結果の解釈可能性について多く語られていたので、Hello World的な試行を赤ワインのデータで行ってみたいと思います。コードは論文を書いた人のGitHubのものを拝借しました。

営業やマーケティングのメンバーに機械学習手法を提案する際に、ひとつひとつの予測結果において、なんでその予測結果になったのか理由が知りたいという要望を受けることが多いです。
ある講演で、実装用のモデルにランダムフォレストやSVMを使い、マネジャーに説明する用に決定木の結果を見せたとかいう話もありました。わざわざモデルを二つ作って説明のための工数を取らなくてよくなると思うと非常にありがたい技術です。事業側の解釈可能性を重視するあまり、シンプルな手法を取らざるを得ない現場には朗報ですね。

目次
・LIMEとは
・データ
・コード
・結果の解釈
・参考情報

LIMEとは

Local Interpretable Model-agnostic Explanationsの頭文字をとったもので、機械学習によって構築したモデルに関して、その予測結果を人間が解釈しやすくする技術です。
流れとしては、

  • まずランダムフォレストなりXGBoostなりで分類器を作る。
  • 任意のデータxを取り出し、解釈可能バージョンのx’(x’∈{0,1}で、xの非ゼロ要素を1としている。)を用意する。
  • x’の周辺のデータをサンプリングする。
  • サンプリングしたデータを使って、元のモデルを近似するために、モデルの距離を目的関数とした最適化問題を解く。
     (K-LASSOという線形モデルの手法を使うことで、最終的に近似するモデルの変数の数を決めている。)
  • 学習したモデルの偏回帰係数を確認して、予測結果への影響度を見る。

という流れのようです。間違っているかもなので、参考情報をご覧になってください。
紹介動画も作られているようです。そういえば、Stanも紹介動画ありましたね。

データ

ワインデータから赤ワインのデータのみを利用します。データの詳細はこちらにあります。
http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality.names

このようなデータセットでデータサイズは1599です。

ワインの質に関するヒストグラムはこんな感じです。

今回の分析の目的

赤ワインの評価値が7以上であれば良いワイン(Y=1)、そうでなければ悪いワイン(Y=0)として、評価値が7を超えるような赤ワインの分類器を学習させ、任意のテストデータを取り出し、そのテストデータが良いワインである要因を探るものとします。

進め方

・LIMEのインストール(pip install lime で一発)
・scikit-learnによる機械学習(ランダムフォレスト)
・LIMEを用いた予測結果の解釈の提示

コード

今回のコードはこちらにもあります。
kamonohashiperry.com/lime_study/Lime_With_Wine Data.ipynb

結果を解釈する以前に、二値分類モデルとして精度が低かったら元も子もないので、精度やAUCを確認してみます。

scikit-learnの引数でclass_weight=”balanced”にしているので、少しは不均衡データに対応できているようです。AUCは8割を超えたかったですが、いったんこれで進めます。

結果の解釈

こちらのコードで、ランダムにインスタンスを選んで、その予測結果とその予測結果に影響を与えている変数を見てみます。

どうやら、このインスタンスを良いワインと予測しており、sulphates(硫酸)が0.74を超えていた、volatile acidity(酢酸とその派生物質)が0.39よりも小さいというのが理由のようです。画像では結果が消えていますが、exp.as_list()で結果を抽出できます。

著者のコードには続きがあって、このインスタンスに対して、値を足したりすることで分類確率がどのように変わるのかが記されていました。今回はアルコールを3%ポイント増やして、総亜硫酸濃度を30増やしてみるものとします。

これを見る限り、アルコールを3%ポイント増やすと、悪いワインの確率が6.2%ポイントあがり、総亜硫酸濃度を30増やすと、悪いワインの確率が49.8%ポイントあがることが示されています。
ワインあまり飲まないので結果の解釈以前に変数の解釈ができていないのは今回のオチになるんでしょうか。このコードをもとに、仕事現場で使ってみようと思います。きっと解釈できるはず。

参考情報

“Why Should I Trust You?” Explaining the Predictions of Any Classifier
lime/doc/notebooks/Tutorial – continuous and categorical features.ipynb
3.2.4.3.1. sklearn.ensemble.RandomForestClassifier
機械学習と解釈可能性 by Sinhrks
機械学習モデルの予測結果を説明するための力が欲しいか…?
LIMEで機械学習の予測結果を解釈してみる
ワインの味(美味しさのグレード)は予測できるか?(1)