なんでも備忘録

Data Science, Kaggle, Cyber Security, CTF, などなど

Linuxの便利コマンド、screenコマンドを使ってみた

会社の先輩から教えてもらったscreenコマンドが便利で、リモートワークをするときにとても役立つので、自分のメモとしてまとめます。

screenコマンドの役割と使い方は後述しますが、使ったことがない&初めて知った方はぜひ使ってみてください!

使うようになったきっかけ

新型コロナウイルスが流行し、3月上旬からリモートワークが始まるようになりました。

今まではローカル(Windows)でコードを動かしていたのですが、データに関するセキュリティの観点から、仮想環境(Linux)でコードを動かすことに。

仮想環境を立ち上げると同時に会社のSSHに接続するため(というより接続しないと動かせない)、コードを実行したあとに突然ネットワークの不調でSSHの接続が切れてしまうとなると、コードの実行も止まってしまいます。

業務ではなかなか処理が重いコードを動かしているため、一度接続が切れてしまうとやり直しをするのにも時間がかかっていました。

先週、定時近くにコードを動かしてしまい、SSHが切れないように業務用のノートパソコンの電源をつけっぱなしにしてもいいか会社の先輩に聞いたところ、Linuxのscreenコマンドを教えてもらいました。

screenコマンドとは

screenコマンドを使用すると、以下のことができます。

  • シェルのセッションを保存できる
  • 1つのSSHセッションで、複数のシェルウィンドウが開ける
  • ネットワークが切断しても、シェルは動かしたままにできる
  • シェルのセッションをアクティブにし続けていなくても、実行時間が長いプロセスを行うことができる

つまり、screenコマンドを使用してセッションを保存すれば、パソコンの電源を消してもコードを回すことができます。

また、SSHが突然切断してしまってもscreenセッション内で動かしていれば、プログラムの実行が中断されるようなことがなくなります。

後述するインストール方法と使い方では、Linuxのターミナルで動かすコマンドをまとめます。

インストール方法

会社用の仮想環境では既にインストール済み&勝手にいじってもダメなので、自分の仮想環境(Ubuntu)で試してみました。

このコマンドは、Debianでインストールをするときも同様のようです。

$apt install screen

同じLinuxでも、CentOSの場合は以下のコマンドでインストールするようです。

$yum install screen

これで、インストールは完了です。

使い方

インストール方法ではOSによって使用するコマンドが違いましたが、使い方で紹介するコマンドはUbuntuDebianCentOS全て共通です。

念のため言っておきますが、スクショの画像は自分のパソコン内の仮想環境のものです!笑

SSHに接続するときは普段通りにSSHコマンドを使用して、screenコマンドを使う前に接続しておきます。

ターミナルを立ち上げて準備ができたら、まず最初に新しいscreenセッションを作成します。

$screen

上記のコマンドを入力してもターミナルに何も変化がないように見えるかもしれませんが、既に新しいscreenセッションの中にいます。

この状態をAttachedといいます。

この状態で普段通りにpythonファイルを実行すると、screenセッション内でプログラムが実行されます。

実行したあとは、Ctrl + a を押し(この時点では画面は何も変わらないです)、dを入力すると以下の画像のように英文(detached from ~)が出てきます。

f:id:a7xche:20200317002230p:plain

この英文が出てきたら、screenセッションから離れた状態になったことを表しています。

この状態をDetachedといいます。

Detachedになったら、SSHを切断したりパソコンの電源を消しても、screenセッション内でプログラムが実行し続けます。

作成したscreenセッションがどのような状態か確認したい場合は、以下のコマンドを入力します。

$screen -ls

すると、以下のような画像の文字が出力されます。

f:id:a7xche:20200316004013p:plain

画僧の中にある、1800.pts-0.kali や 1765.pts-0.kali は、セッションIDです。

セッションIDは、screenコマンドで新しく作成した分だけ表示されます。

各セッションIDの横にある、(Attached) や (Detached) は、セッションの状態を表しています。

Detachedの状態のものをAttachedにしたい場合、以下のコマンドを入力します。

$screen -r {セッションID}

このコマンドを入力すると、選択したscreenセッションに再び入ることができます。

以上が基本的なscreenコマンドの使い方です。

使ってみての感想

SSHの接続が切れてしまっても、screenセッション内で動かしていれば問題ないのがとても助かります。

このコマンドを知ってから、万が一SSHの接続が切れても大丈夫なように、毎回screenセッション内でコードを回しています。

リモートワークにおいて重宝するコマンドなので、皆さんもぜひ。

第2回 データアーキテクト(データ整備人)を”前向きに”考える会に参加しました

2020年2月6日、株式会社エウレカで第2回 データアーキテクト(データ整備人)を”前向きに”考える会というイベントに参加しました。

analytics-and-intelligence.connpass.com

この会は、データ抽出・加工・整備を行うデータアーキテクトと呼ばれるポジションのスキルやノウハウについて発表者が話してみんなで考える会です。

現在、私はデータサイエンティストとして働いていますがデータの抽出や集計も業務の一部として行っているため、とても興味深くてぜひ参加したいと思い、応募しました。

この会は非常に人気なため、抽選でしたが当選したので参加することができました。

実際にお話を聞いてみて、共感したところや勉強になったことが多かったので、発表者ごとに内容をまとめたいと思います。

しんゆう さん

タイトル

抽出や集計の依頼を受ける時に気を付けていること

内容
  • データ抽出を行うときは、

   1. 依頼内容をしっかり聞き、
   2. 具体的な納期を依頼者から確認し、
   3. 依頼内容とデータを鵜呑みにしない

  • データ抽出の目的は、データを使ってやりたいことを実現すること
  • データ抽出の依頼を受けて本当に求められているのが、データ・分析・提案のどれなのか確認する
  • データ抽出の依頼を受けたとき、"やっぱりこのデータも欲しい"というのを見越しておく
  • データ自体の納期確認だけでなく、依頼者がいつまでに何が知りたいのかも聞く

speakerdeck.com

スマホで見ている方はこちらからどうぞ↓
https://speakerdeck.com/shinu/maemuki-data-seibinin02

mida さん

タイトル

データエンジニアとデータアナリストを兼任して良かったこと

内容
  • データの流れは、データソース⇒分析基盤⇒集計・分析⇒意思決定
  • 分析要求の流れは、意思決定⇒集計・分析⇒分析基盤⇒データソース
  • データエンジニアが担当するのは、データソースを分析基盤に落とすこと
  • データアナリストが担当するのは、データの集計と分析を行って意思決定をすること
  • データエンジニアとデータアナリストの前提知識が違うため齟齬が発生しやすく、作業のタイムロスが発生してしまう
  • データエンジニアとデータアナリストを兼任していると、データを把握しているから、分析をするためのデータ加工や追加のデータ抽出などをスムーズに行うことができる
  • チームで作業している場合、メンバーに対してデータの意味や分析の情報を同時に提供できる

www.slideshare.net

sotaron さん

タイトル

データの価値を失わないためのData Reliability Engineeringについて

内容
  • データ整備も大事だが、正確な分析をするためにはデータ自体の品質や信頼性(= Reliability)も大事
  • Data Reliability Engineering(DRE)の定義はどこかの機関が定めたわけではない
  • sotaronさんにとってDREとは、以下を保つこと

   1. データの完全性
   2. データの一貫性
   3. データの新鮮さ
   4. データの可用性

  • DREは、正しい意思決定をするために必要
  • DREをするには、最初にサービスレベルの設計をして、開発・改善・モニタリングを繰り返す

speakerdeck.com

スマホで見ている方はこちらからどうぞ↓
https://speakerdeck.com/tanakarian/detafalsejia-zhi-woshi-wanaitamefalsedata-reliability

ぶんけい さん

タイトル

意思決定に繋がる Intelligence とは

内容
  • 世の中のデータ量が増加しているのに対して、国内のIT人材はまだ不足しているのに関わらず、経営者や上司を納得させないと意味がない
  • 経営者や上司を納得させるには、+αの価値を提供できるようにする
  • データを集めても、意思決定ができないとそのデータの価値は無い
  • データを活用するためには、数値データと地図データといったような複数のデータを組み合わせ、誰が見てもすぐに言いたいことが分かるようにする(= Intelligence)
  • Intelligence = Insight + Intuition
  • ちょっとした工夫や作業でIntelligenceに

まとめ

この会では、各発表者からデータ抽出・加工だけでなく、データの運用や可視化のコツまで学ぶことができました。

今までデータアーキテクトについて深く考えずに業務をこなしてきたので、今回学んだことを活かしていきたいと思います。

ちなみに、connpassでは第3回 データアーキテクト(データ整備人)を”前向きに”考える会の参加者を募集しています。

人気のため抽選となっていますが、おすすめなのでぜひ。

私は次回も抽選枠で応募したので、また当たるのを願うばかりです、、、!

analytics-and-intelligence.connpass.com

Python + OpenCVの勉強会に参加しました

2020年1月26日、日本マイクロソフト株式会社でPyLadies Tokyoが主催するPython + OpenCVの勉強会に参加してきました。

PyLadiesとは、Pythonが好きな女性のためのコミュニティであり、全世界に各支部があるそうです。

日本には、東京・京都・沖縄の3つの支部があるとご紹介がありました。
今回は、東京支部のmeetupということで、OpenCVをマスターしてインスタグラムやSNOWのように画像を加工して遊ぶという内容でした。

今までOpenCVを使用したことがありませんでしたが、基礎から丁寧に説明してくださったので非常に分かりやすかったです。

OpenCVとは何か、どのようにJupyter Notebook上でPythonコードを書くかを簡単にですがまとめたいと思います。

OpenCVとは

画像処理(色、サイズの編集や画像のnumpy/幾何学変換)や画像解析(特徴・物体検出)のためのオープンソースライブラリです。

加工した画像を、scikit-learnやKerasといった機械学習ライブラリと組み合わせることができ、人物検出などを行うことが可能です。

対応言語はPythonだけでなく、C++Javaも含まれているとのことです。

事前準備

OpenCVを使うためには、まずライブラリをインストールする必要があります。

私の場合は、Anaconda Promptを使用して以下のコマンドでインストールしました。

pip install opencv-python

ライブラリのインポート、ファイル読込みと表示

コードは以下の通りです。

# OpenCVのインポート
import cv2
# 読み込んだ画像を表示させるために必要
import matplotlib.pyplot as plt
# Jupyter Notebook上でインライン表示させる
%matplotlib inline


# 画像ファイルの読込
# "imgName.jpg"は読み込みたい画像のファイル名
img = cv2.imread("imgName.jpg")

# 色空間の変換 (注1)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 画像ファイルの表示
plt.imshow(img_rgb)
plt.show()

(注1) OpenCVはBGR空間(色の情報がBlue, Green, Redの順で保持)であるのに対し、matplotlibはRGB空間(Red, Green, Blue)なので変換が必要です。

変換せずに出力するとどうなるかは、ぜひ試してみてください。

グレースケール空間への変換

cv2.cvtColor()の関数を使用して他の色空間に変換することも可能です。

色空間は様々な種類がありますが、今回はグレースケール空間への変換の方法を紹介します。

画像をグレースケール空間に変換するということは、色の情報が必要のない処理において、色の情報を落とすことによってデータ量と処理を軽くするというメリットがあるとのことです。

上記のコードで読み込んだ画像(変数 img)をグレースケール空間へ変換して出力するコードは以下の通りです。

# 読み込んだ画像をモノクロにする
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# (注2)
plt.imshow(cv2.cvtColor(gray, cv2.COLOR_BGR2RGB))
plt.show()

(注2) 変数grayは既にモノクロだから色空間の変換が必要でないように見えますが、おそらくimshow()というBGR空間であるOpenCVの関数で表示させようとしているため、BGR空間からRGB空間に変換する必要があります。

ファイルの書き出し

OpenCVでファイルの書き出しを行うには、imwrite()という関数を使用します。

上記のコードでグレースケール空間に変換した画像を書きだそうと思います。

コードは以下の通りです。

# "gray.jpg"はファイル名、拡張子(.jpg)をつけ忘れない
cv2.imwrite("gray.jpg", gray)

これで、モノクロに変換した画像がgray.jpgというファイル名で保存されます。

その他の画像加工テクニック

この記事の先頭の方に書いた通り、今回はOpenCVでインスタグラムやSNOWのように画像を加工するというイベントでした。

なので、画像にフィルターをかけたような色変換をしたり、bit変換を行ってネガポジ反転させる方法も学びました。

それぞれのコードの書きかたは以下の通りです。

# カラーマップ変換
# applyColorMap()関数で他のカラーマップに変換
# 今回はCOLORMAP_INFERNOというカラーマップに変換
# カラーマップは今回教えていただいたものだけでも15種類もある
color_map = cv2.applyColorMap(img, cv2.COLORMAP_INFERNO) 

plt.imshow(cv2.cvtColor(color_map, cv2.COLOR_BGR2RGB))
plt.show()
# ネガポジ反転
# bitwise_not()関数で色の情報を反転
inversion = cv2.bitwise_not(img)

plt.imshow(cv2.cvtColor(inversion, cv2.COLOR_BGR2RGB))
plt.show()

機械学習用の画像加工テクニック

勉強会では、エッジ検出のコードの書き方も教えていただきました。

機械学習でエッジ検出を行う場合は前処理をしてからの方が良いとのことです。

エッジ検出のアルゴリズムはいくつかあるみたいで、今回はCanny(キャニー)法を学びました。

OpenCVのサイトに理論が記載されてますので、ご紹介します。

labs.eecs.tottori-u.ac.jp

以下がCanny法によるエッジ検出のコードになります。

# 0は最小閾値、80は最大閾値
# 閾値はCanny法検出内ので行われるヒステリシス式閾値処理に利用
# ヒステリシス式閾値処理については上記のサイトを参照
edge = cv2.Canny(img, 0, 80)

plt.imshow(cv2.cvtColor(edge, cv2.COLOR_BGR2RGB))
plt.show()

まとめ

今回はOpenCVで画像の読込み、書き出し、加工の仕方を学びました。

勉強会の趣旨の通り、OpenCVで画像を加工して遊ぶ目的で参加しました。

画像処理は難しそうというイメージを持っていましたが、一つ一つの処理は実は簡単であり、複数の処理を組み合わせで高度な処理ができることが分かりました。

エッジ検出に関してはKaggleの画像コンペで活かせそうな気がするので、今度使ってみたいと思います。

攻撃自動検知モデルを作成するワークショップに参加しました

2019年12月21日と22日の2日間、秋葉原SECCON 2019 Akihabaraが開催されています。

このイベントでは、サイバーセキュリティに関するカンファレンス、ワークショップ、展示が行われています。

また、SECCON CTF 2019と呼ばれるセキュリティの技術を競う大会が開かれていて、2日間にかけて国内大会と国際大会の決勝戦があります。

大会の様子は会場で直接見ることができ、決勝戦ということもあって参加者の皆さんは凄く集中して落ち着きながら問題を解いているようでした!

写真は、国際大会のランキング表です。

なんだかエヴァンゲリオンっぽい笑

f:id:a7xche:20191221221736j:plain

 

21日に、開催前から気になっていた、攻撃自動検知ワークショップに参加してきました!

Cyber Securityと機械学習の両方に興味がある私にとっては、夢のようなワークショップだったため、楽しみ過ぎて会場には一番乗りでした。

 概要

クロスサイトスクリプティングXSS)を突く攻撃(XSS文字列)を検知するモデルを作成し、運営が用意したデータに対して”正常・攻撃”の二値分類(0 or 1)をするというものです。

モデルのベースは運営が用意したものを使用し、特徴量エンジニアリングやハイパーパラメータのチューニングをして検知の精度を上げて競いました。

データ

train/test dataは、tsv形式のファイルです。

ファイルの中身は、HTMLのソースコードと攻撃ペイロードのコードを混ぜたもので、train dataには正常か攻撃かのラベルも列としてありました。

モデル作成

ファイルの中身がソースコード(文字列)であるため、前処理の仕方としては自然言語処理に近い印象でした。

運営が用意したモデルは2種類あり、ナイーブベイズ分類器と多層パーセプトロンです。

コードを変更せずに二値分類することも可能でしたが、精度を上げるために特徴量エンジニアリングやハイパーパラメータのチューニングをしました。

ちなみにですが、モデルの作成をするときはサイバーセキュリティの知識は全く必要なく、機械学習モデルを構築できるスキルの方が重要でした。

結果

私は、多層パーセプトロンのモデルを改良して検知の結果を提出しました。

モデルの精度はそこそこ高かったのですが、accuracyはサイバーセキュリティの観点からすると低いので、まだまだ改良する必要があります。

攻撃を検知するのも大事ですが誤検知を防ぐことも大事なので、accuracyの数値が高いことが求められるとのこと。

余談ですが、今回のワークショップでaccuracyが99%の方がいましたが、train dataで攻撃ラベルが付いているデータを目視で見分け、test dataの正解ラベルには手打ちで入力したそうです。

なので、モデル作成も大事ですが、自然言語処理においてもEDAの大切さを改めて感じました。

 

ワークショップでは、機械学習モデルがサイバーセキュリティの分野でどのように活用されているのかと同時に、機械学習のモデル精度がより高く求められることを知ることができました。

引き続き、作成したコードを改良して勉強したいと思います。

Kaggle Days Tokyoに参加しました

2019年12月11日と12日の2日間、"Kaggle Days Tokyo"に参加してきました。

kaggledays.com

Kaggle Daysとは、 2018年から始まった、年に4~5回行われるKaggleのオフラインイベントです。

会場となる国・地域はイベントごとに異なり、今回は東京で開催されました。

公式サイトのアジェンダにある通り、11日(Day 1)はKaggleのGrandmasterやMasterの方々によるプレゼンテーションとワークショップ、12日(Day2)はKaggle Days Tokyoの参加者のみが参加できるオフラインコンペティションが行われました。

Day 1

Day 1では、Kaggleのコンペで使えるテクニックを中心に紹介してくださいました。

発表中やワークショップの最中は、聞きながらメモを取るのに必死。

Kaggleは1年ほど前にフリーランスアルバイトの研修で使用していたため、アカウントは持っていましたがコンペに挑み始めたのは今年の10月だったので、どのプレゼンテーションも為になるものでした。

私が聴講(参加)したプレゼンテーションとワークショップを、いくつかまとめようと思います。

Tutorial on Model Validation and Parameter Tuning by Raja Iqbal
  • Kaggleにおいてのtrain/test dataの定義
  • overfittingは、generalizationが不足しているときに起きる
  • train/test dataで正確に予測できても、overfittingは起こりうる
  • overfittingを防ぐために、パラメーターチューニングをする
  • Kaggleにおいて、一般的にはtrain dataの70%をモデル作成のために、残りの30%はモデル評価のために使う
  • bias/variance tradeoffについてのディスカッション
  • High biasは、underfittingを起こす
  • High varianceは、overfittingを起こす
  • パラメーターチューニングと、交差検証の方法の紹介
Joining NN Competitions (for beginners) by Tomohiro Takesako
  • NNコンペの取り組み方 (コンペの選択→ベースライン作成→改良)
  • 純粋に興味がある画像コンペを選ぶのがいい
  • beginnerは、時間をかけてでもベースラインを作り上げるのが大事
  • augmentationは目視で注意深く確認
  • モデル改善のために、まずはvalidationを確立させる
  • スコアが変わる原因を突き止めるために、random seedは固定する
  • スタンダードなやり方を知るために、論文やKaggleのdiscussion、他の人のnotebookを読んで勉強
Imputation Strategy by Yuji Hiramatsu
  • 統計学的に欠損値の発生の仕方は、MCAR (Missing Completely At Random)、MAR (Missing At Random)、NMAR (Not Missing At Random) の3パターン
  • 欠損があるデータは削除するという、LD (Listwise Deletion)、PD (Pairwise Deletion) の2パターンの方法があるが、統計学的には推奨されない
  • 欠損値補完の方法として、単一代入法、多重代入法の2パターンがある
  • XGBoostはNAを活かして予測できる
How to Encode Categorical Features for GBDT by Ryuji Sakata
  • カテゴリ型のデータをエンコードする方法として、主に3種類
  • one-hot encodingは、線形回帰でよく使われる
  • label encodingは、GBDTで使われる
  • target encodingは、out of foldでエンコードするのが良いが、foldの数が多いと過学習を起こす
  • 他のエンコードの方法として、feature hasing、frequency encoding、embeddingなどがある
  • one-hot encoding、label encoding、target encoding、LGBMのcategorical feature supportを、num_leavesの数ごとで比較
  • num_leavesの数ごとに、精度の良いモデルが違う

以下は、プレゼンターの方々が共有してくださったスライドのリンクです。

Imputation Strategy by Yuji Hiramatsu

How to Encode Categorical Features for GBDT by Ryuji Sakata (Jack)

Feature Engineering Techniques & GBDT implementation by Daisuke Kadowaki

My Journey to Grandmaster: Success & Failure by Jin Zhan

Day 2

Day 2では、日経電子版のデータを使用して、ユーザの年齢を予測するというコンペが行われました。

hack.nikkei.com

Day 1の終了後、Twitter上でチームを組んでくれるという方に出会い、一緒にコンペに挑むことに。

初対面の方とのコンペは初めてでしたが、次第に仲良くなり、モデル作成方法や特徴量エンジニアリングに悩みつつも、楽しく参加することができました!

コンペ終了後は、1位~3位の表彰式と各チームがどのように予測したかを知ることができ、とても勉強になりました。

ちなみにですが、Day 2では運営の方のアナウンスもあって、全員KaggleのTシャツを着て参加しました!

f:id:a7xche:20191221001740j:plain

 

Celebration Party

その後はパーティが開かれ、他のKagglerの方たちと交流する良い機会となりました。

食事として、可愛いカップケーキもありました!

f:id:a7xche:20191220231457j:plain



Twitter上で繋がった方とも直接お話ができ、楽しかったです :)

また、Kaggleで勝つデータ分析の技術(通称:Kaggle本)を持参し、著者であるthreecourseさん、Jackさん、Maxwellさん(私の名前入りで!)からサインを頂きました!

パーティが終わった後も、Kaggle本の著者の方々を含めたKagglerの方々に、Kaggleの勉強法を中心に色々なお話を聞くことができました。

最後に 

Kaggleのイベントは初めて参加しましたが、Kagglerの皆さんは優しい方ばかりで、Kaggle新参者の私にも基礎的なお話を含めて様々なことを教えてくださいました。

プレゼンテーションとワークショップで学んだことをKaggleのコンペで取り入れて、自分のスキルとして身につけたいです。

この先もKaggleの勉強を頑張り、メダルを目指したいと思います!