sammi@DataScience

Python, Machine Learning, Deep Leaning, Data Science, Kaggle.

スポンサーリンク

Azure資格 DP-100 勉強法と試験対策

はじめに

 前述したAZ-900の話もあって、 sammi-baba.hatenablog.com

勢いでData ScienceまわりのDP-100 (Designing and Implementing a Data Science Solution on Azure)も受験してみました。 そして、2週間頑張った自分のおかげで、無事に合格できました~
というわけで、DP-100向けの勉強法経験談を記事にまとめていきたいと思います。もしご参考になって頂ければ幸いです!  

試験範囲

・Azure Machine Learningワークスペースのセットアップ (30 ~ 35%)
・実験の実行とモデルのトレーニング (25 ~ 30%)
・モデルの最適化と管理 (20 ~ 25%)
・モデルのデプロイと使用 (20 ~ 25%)

勉強法

①まずはDP-100ランニングパスに沿ってAzure Machine Learningの概念と内容をしっかり覚えること↓

docs.microsoft.com

➁そして、理解を深めるために、Azure の無料アカウント作ってランニングパスのコード実践してみました。
(Azureの無料アカウントは最初に¥22,500のクレジット付与されますので、気軽に試すことができます↓)
f:id:sammi_baba:20201230150706p:plain azure.microsoft.com

(この部分はおよそ2週間かかった)  

試験対策

DP100まわりの本と資料は少ないので、じっくりDP-100ランニングパスの文章とコード読むのがおすすめ
そして、実践も欠かせないことです。

試験

当日は自宅でオンライン試験受けていました。
(身分証明を事前に用意し、30分前からチェックインできる)

2.5時間の試験で大体55問くらいがあって、すべてが選択肢ある問題です。
前に60%機械学習基礎、40%Azure Machine Learningという噂があったんですけど、実際は20%対80%という肌感。
意外にAzure Machine Learningのコード読んで、最適な候補コードやソリューション選ぶ形式が多い。 難易度はAZ-900より高くなって、問題解くのに2時間ほどかかりました。
試験終わったら、その場で結果が分かります。

試験結果

ドキドキしてたけど無事に800点を超えました↓ f:id:sammi_baba:20201228223804p:plain

Azure資格 AZ-900 勉強法と試験対策

はじめに

  先日Microsoft Azure Fundamentals(AZ-900)を受験して無事に合格できましたので、AZ-900向けの勉強法試験対策を記事にまとめていきたいと思います。もしご参考になって頂ければ幸いです。  

試験範囲

・cloudのコンセプトに関する説明(20〜25%)
・コアAzureサービスに関する説明(15〜20%)
・Azureのコアソリューションと管理ツールに関する説明(10〜15%)
・一般的なセキュリティおよびネットワークセキュリティ機能に関する説明(10〜15%)
・ID、ガバナンス、プライバシー、およびコンプライアンス機能に関する説明(20〜25%)
・Azureのコスト管理とService Level Agreementsに関する説明(10〜15%)

勉強法

①まずはマイクロソフト無料トレーニンイベントの申し込みはおすすめです↓ www.microsoft.com

2日間のトレーニング通して、大体試験まわりの概念を習得できると思います。しかも2日間両日を受講された方には、AZ-900を無料で受験できる特典を用意しているようです~ 要は、欠席しなかったら、無料受験特典がもらえるんですね。(確かに、翌日で特典メールが届きました)  
 
②そして、理解を深めるために、AZ-900ランニングパスに沿ってもう一度復習しました↓

docs.microsoft.com

(この部分はおよそ2週間かかった)  

試験対策

試験5日前に、下記の本を買って一度模擬試験してました。

(この部分はおよそ2日間かかった)

試験

当日は自宅でオンライン試験受けていました。
(身分証明を事前に用意し、30分前からチェックインできる)

大体50問くらいがあって、すべてが選択肢ある問題です。
難易度はそれほど高くなくて、30分ほどで試験を解き切ってしまいました。
試験終わったら、その場で結果が分かります。

試験結果

一瞬結果出るので、ドキドキしてたけど無事に800点を超えました↓ f:id:sammi_baba:20201228203100p:plain

続編、DP-100の勉強法について話したいと思います:
sammi-baba.hatenablog.com

pandas.read_gbqでBigQueryのデータをDataframeに出力

はじめに

  BigQueryに保存されているデータをpandasで弄りたい時に、pandasのread_gbqという関数を使うだけでBigQueryのデータをDataframeに出力することができます。今回はread_gbqについて紹介していきたいと思います。  

事前準備

  ①https://cloud.google.com/sdk/SDKパッケージをダウンロードしてCLOUD SDKをインストールします。
 
②ターミナルで、pip install google-api-python-clientと入力し、clientをインストールします。
 
③ターミナルで、pip install pandas-gbqと入力し、pandas-gbqをインストールします。
 

read_gbqの例

 

import pandas as pd
 
#project_id : 使用しているBigQueryのプロジェクト名  
project_id = 'xxxx'
 
#query : SQLを文字列として入力します。  
query = "SELECT * FROM `xxxx_dataset.xxxxx_table`;"
 
#dialect='standard'
#スタンダードSQL(レガシーSQLではなく)を指定しています
df = pd.read_gbq(query, project_id, dialect='standard')


実行すると"Enter the authorization codeという提示が出てきますので、提示にあるリンクをクリックし、許可コードをコピペするとBQのselect結果がDataframeに出力されるはずです。そして、2回目以降は許可コードは要らないです。

おススメ書籍:つくりながら学ぶ! PyTorchによる発展ディープラーニング

最近TwitterのKaggle界隈でこの本が話題になっているようです:

【学習できるタスク】
転移学習:ファインチューニング:少量の画像データからディープラーニングモデルを構築
物体検出(SSD):画像のどこに何が映っているのかを検出
セマンティックセグメンテーション(PSPNet)ピクセルレベルで画像内の物体を検出
姿勢推定(OpenPose):人物を検出し人体の各部位を同定しリンク
GAN:(DCGAN、Self-Attention GAN):現実に存在するような画像を生成
異常検知:(AnoGAN、Efficient GAN):正常画像のみからGANで異常画像を検出
自然言語処理:(Transformer、BERT):テキストデータの感情分析を実施
動画分類:(3DCNN、ECO):人物動作の動画データをクラス分類

パッと見ると、タスクごとにディープラーニングの知識を網羅的にまとめている一冊ですね。

実装と応用の角度から解説していて、サンプルコードも充実、MLエンジニアにとってかなり読みやすい本と思います。

読みたいな~

不均衡データの評価指標 - マシューズ相関係数(MCC)とF1スコアの比較

目次:

はじめに

前回は実装例に基づいて、ROC曲線が不均衡データに対して、Positiveは少数クラスの場合でも、Negativeは少数クラスの場合でも簡単に0.90+上がってしまうという欠点について説明してみました:

sammi-baba.hatenablog.com

というわけで、不均衡データ(imbalanced data)におけるモデル評価する時に、指標としてはマシューズ相関係数(Matthews Correlation Coefficient)とF1_Score使用した方がマシです。今回はMCCとF1_Scoreについて紹介し、さらに両者の違いを比較します。

MCCとF1_Scoreの紹介

F1_Scoreは分類モデルの評価指標の一つで、precisionとrecall両方とも考慮して、調和平均でスコアを計算します。ある程度precisionとrecallのバランスを表しています。スコアの範囲は最悪0~最善1まで。F1_Scoreの公式は下記の通り: f:id:sammi_baba:20190731170939j:plain

ちなみに、一般式としてFbeta_Scoreがあります:
f:id:sammi_baba:20190731170955j:plain

F1_Scoreはbeta=1の場合です。

同じく、F2_Score, F3_Score。。も存在しています。

betaというのは全公式の重みで、betaが大きければ、pecisionの重みが小さく、recallの重み大きくになります。

MCC真陽性(TP),偽陽性(FP),真陰性(TN),偽陰性(FN)を全部考慮したうえで、クラスのサイズが非常に異なっていても使用できる分類モデルの評価指標です。
本質的にというと、MCCは予測された二値分類結果と実際結果の相関係数です。つまり予測と答えはどれだけ近いか測るための尺度で、値の範囲は最悪-1~最善1まで。+1は完璧な予測結果、0はランダム予測結果、−1は予測結果と実際結果が完全な不一致を表しています。MCCの公式は下記の通り: f:id:sammi_baba:20190731171029j:plain

不均衡データにおけるMCCとF1_Scoreの実装

早速実装していきましょう~

今回はsklearnのmatthews_corrcoefを使用します。

必要なライブラリ:

import numpy as np
import matplotlib.pyplot as plt

from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

from sklearn.metrics import matthews_corrcoef
from sklearn.metrics import f1_score

①Positiveは少数クラスの場合

10000個の疑似データが約0 : 1 = 0.95 : 0.05の割合で生成されます(ノイズ含む):

X, y = make_classification(n_samples=10000, n_classes=2, weights=[0.95,0.05], random_state=42)
trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.2, random_state=2)

LogisticRegressionで学習します:

model = LogisticRegression()
model.fit(trainX, trainy)
probs = model.predict_proba(testX)
probs = probs[:, 1] 

プロットします:

#plot
thresholds = np.linspace(0.1,1,num=10)
mcc_list = []
f1_list = []

for thr in thresholds:
    predict  = (probs > thr).astype(int)
    mcc = matthews_corrcoef(testy, predict)
    f1 = f1_score(testy, predict)
    mcc_list.append(mcc)
    f1_list.append(f1)
    
    
plt.plot(thresholds, f1_list, linestyle='--', label="f1_score")
plt.plot(thresholds, mcc_list, marker='.', label="mcc")
plt.legend()
plt.xlabel("Threshold")
plt.ylabel("Score")
plt.show()

プロットの結果:
f:id:sammi_baba:20190731171051j:plain

Positiveは少数クラスの場合には、MCCとF1_score両方とも適切にモデルを評価できます。

②Negativeは少数クラスの場合

10000個の疑似データが約0 : 1 = 0.05 : 0.95の割合で生成されます(ノイズ含む):

X, y = make_classification(n_samples=10000, n_classes=2, weights=[0.05,0.95], random_state=42)
trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.2, random_state=2)

LogisticRegressionで学習します:

model = LogisticRegression()
model.fit(trainX, trainy)
probs = model.predict_proba(testX)
probs = probs[:, 1] 

プロットします:

#plot
thresholds = np.linspace(0.1,1,num=10)
mcc_list = []
f1_list = []

for thr in thresholds:
    predict  = (probs > thr).astype(int)
    mcc = matthews_corrcoef(testy, predict)
    f1 = f1_score(testy, predict)
    mcc_list.append(mcc)
    f1_list.append(f1)
    
    
plt.plot(thresholds, f1_list, linestyle='--', label="f1_score")
plt.plot(thresholds, mcc_list, marker='.', label="mcc")
plt.legend()
plt.xlabel("Threshold")
plt.ylabel("Score")
plt.show()

プロットの結果:
f:id:sammi_baba:20190731171106j:plain

Negativeは少数クラスの場合には、F1_scoreとMCCが似たような動きをしていないです。 なぜならば、F1_scoreは正負クラスの定義に影響されます。逆に、MCCは正負クラスをどう定義するかに依存せず、同じ動きを取ります。

まとめ

○ 不均衡データにおけるモデル評価指標としては、MCCとF1_scoreがおすすめです。
○ F1_scoreは正負クラスの定義に影響されやすい。
○ MCCは一番安全です。

不均衡データ - ROC曲線欠点の実装例

目次:

はじめに

前回はROC AUCの欠点に関して少し言及しましたが、

sammi-baba.hatenablog.com

今回は実装例に基づいて、ROC曲線が不均衡データ(imbalanced data)に対して簡単に0.90+上がってしまうという欠点に関して説明していきたいと思います。

必要なライブラリ:

import numpy as np
import matplotlib.pyplot as plt

from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score
from sklearn.metrics import classification_report

不均衡データ:Positiveは少数クラスの場合


10000個の疑似データが約0 : 1 = 0.95 : 0.05の割合で生成されます(ノイズ含む):

X, y = make_classification(n_samples=10000, n_classes=2, weights=[0.95,0.05], random_state=42)
trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.2, random_state=2)

LogisticRegressionで学習します:

model = LogisticRegression()
model.fit(trainX, trainy)

プロットします:

probs = model.predict_proba(testX)
probs = probs[:, 1] 

fpr, tpr, thresholds = roc_curve(testy, probs)
plt.plot([0, 1], [0, 1], linestyle='--', label="random")
plt.plot(fpr, tpr, marker='.', label="LR")
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.show()
auc_score = roc_auc_score(testy, probs)
print('AUC: %.3f' % auc_score)

f:id:sammi_baba:20190730171459j:plain

AUC:0.920 ! めちゃ良いモデルと思われがちですが、実はそうではない:

predictions = model.predict(testX)
print(classification_report(testy, predictions))

f:id:sammi_baba:20190730171516j:plain

少数クラスのrecallとf1_scoreわずか0.4, 0.5くらいものです!!!

不均衡データ:Negativeは少数クラスの場合

同様に、


10000個の疑似データが約0 : 1 = 0.05 : 0.95の割合で生成されます(ノイズ含む):

X, y = make_classification(n_samples=10000, n_classes=2, weights=[0.05,0.95], random_state=42)
trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.2, random_state=2)

LogisticRegressionで学習します:

model = LogisticRegression()
model.fit(trainX, trainy)

プロットします:

probs = model.predict_proba(testX)
probs = probs[:, 1] 

fpr, tpr, thresholds = roc_curve(testy, probs)
plt.plot([0, 1], [0, 1], linestyle='--', label="random")
plt.plot(fpr, tpr, marker='.', label="LR")
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.show()
auc_score = roc_auc_score(testy, probs)
print('AUC: %.3f' % auc_score)

f:id:sammi_baba:20190730171536j:plain

AUC:0.895 !

predictions = model.predict(testX)
print(classification_report(testy, predictions))

f:id:sammi_baba:20190730171544j:plain

少数クラスのrecallとf1_scoreわずか0.4, 0.5くらい!

というわけで、不均衡データの分類モデルを評価する際に、絶対ROC_AUC曲線を信じちゃダメです〜それより評価指標としてMCCやF1_scoreの方が良いです。

次回は不均衡データにも適切に評価できるマシューズ相関係数(Matthews Correlation Coefficient)とF1_scoreについて紹介と比較したいと思います、ぜひご覧ください:

sammi-baba.hatenablog.com

ROC_AUC曲線の解説、実装と欠点

目次:


はじめに

ROC_AUC曲線は分類モデルのパフォーマンスを評価するための重要な指標です。現場やkaggleコンペでよく使われています。実装はシンプルでグラフも見やすいので、かなりいい指標ですが、全ての場合に使えるわけではないです。今回はROC_AUC曲線について詳しく解説していきたいと思います。

ROC_AUC曲線の解説

分かりやすくするために、高血圧の例を挙げて説明します。

二値分類モデルの予測には4つの結果があります:
真陽性(TP):実際は高血圧(P)で予測も高血圧(P)です。
偽陽性(FP):実際は高血圧ではない(N)が予測は高血圧(P)です。
真陰性(TN):実際は高血圧ではない(N)で予測も高血圧ではない(N)。
偽陰性(FN):実際は高血圧(P)で予測は高血圧ではない(N)。

P: Positive or 1
N: Negative or 0

f:id:sammi_baba:20190728194441p:plain

そこで、4つの結果から真陽性率(TPR)と偽陽性率(FPR)も計算可能となります:

真陽性率(True Positive Rate):TP/(TP+FN)
偽陽性率(False Positive Rate):FP/(FP+TN)

下記のように計算されるFalse Positive RateをX軸とし、True Positive RateをY軸とします。しきい値(threshold:1->0)の変化に従って点をプロットし、それを線でつないだグラフをROC曲線(Receiver operating characteristic曲線,受信者操作特性曲線)と言います:
P(x) Negative
P(x)>threshold -> Postive

f:id:sammi_baba:20190728194554p:plain

緑線は理想モデルの結果、青線はランダムモデルの結果、普通に作られたモデルは赤線のように緑線と青線の間に描かれっています。

しきい値が1の場合に、予測結果は全てNegativeになってしまって、ROC曲線は必ず(0,0)に通過します。
しきい値が0の場合に、予測結果は全てPostiveになってしまって、ROC曲線は必ず(1,1)に通過します。

AUC(Area under curve)というのはROC曲線以下に囲まれた面積です。緑線は正方形で面積は1、青線は三角形で面積は0.5、普通に作られたモデルのAUCは下記のように0.5~1の間です:

f:id:sammi_baba:20190728194618p:plain

ROC_AUC曲線の実装

ROC_AUC曲線の実装についてはscikit-learnの例をそのまま説明していきます:

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# irisのデータを導入
iris = datasets.load_iris()
X = iris.data
y = iris.target

# Yを二値化
y = np.where(y>0, 1, y)

# ノイズを加える
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]

# 順番をシャッフルする
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5,random_state=0)

# Logistic分類モデルを構築する
classifier = LogisticRegression()
classifier.fit(X_train, y_train)

#予測する
y_score = classifier.predict_proba(X_test)[: ,1]

#可視化する
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc

fpr, tpr,thred = roc_curve(y_test, y_score)
roc_auc = auc(fpr, tpr)
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

プロットの結果:

f:id:sammi_baba:20190905224342p:plain

繋がっている点の数が増えたらもっと滑かになるはずですが、今回は中途半端になってしまいました。

ROC_AUC曲線の欠点

ROC_AUC曲線は評価指標として分類モデルのパフォーマンスをよく反映できますけれども、不均衡データに対してしばしば簡単に0.90+上がってしまうという欠点があります。不均衡データの分類モデルを評価する際に、絶対ROC_AUC曲線を信じちゃダメです〜

次回は実装例に基づいてこういう欠点に関して説明します。ぜひご覧ください:

sammi-baba.hatenablog.com

python foliumで時系列ヒートマップ(time series heatmap)描く

目次:


はじめに

foliumはpythonの地図描画ライブラリーとしてよく知られています。foliumを使用することよりヒートマップやコロプレス図など様々なグラフを地図上に描くことが可能です。以前はfoliumを使用したことがありますけれども、ほとんどは静的なグラフです。

今回は地図上に時系列ヒートマップで都道府県別の人口がどんなふうに変化するかをプロットしてみようと思います。

ちなみに、実行環境はPython3+JupyterNotebookです。

ライブラリー用意

今回はpandasとfoliumが必要です。

!pip install pandas
!pip install folium

インストール完了したら、ライブラリを導入します:

import pandas as pd
import folium
from folium import plugins

データ準備

一方、データ準備としては、都道府県別の人口は国勢調査サイト(e-stat)から入手できます:

平成29年10月1日現在人口推計 都道府県,男女別人口-総人口

population_df = pd.read_csv("population.csv",encoding="shift-JIS")
population_df.head()

f:id:sammi_baba:20181225063026p:plain

そして、都道府県別のGeocodeいわゆる緯度と経度の情報も必要なので、以下のGithubからダウンロードします:

都道府県庁の所在する緯度と経度(CSV形式)

geo_df = pd.read_csv("prefecturalCapital.csv", encoding="utf-8")
geo_df.head()

f:id:sammi_baba:20181225063028p:plain

フォーマットを揃え

紐付けのために、データのフォーマットを揃えないといけない。

population_df["id"] = population_df.index+1
prefecture_df = pd.merge(population_df,geo_df,on=["id"])
prefecture_df = prefecture_df.drop(["nam_ja","id"],axis=1)
prefecture_df.head()

f:id:sammi_baba:20181225070803p:plain

そして、タイムインデックスを作ります。

time_series = ["17","22","27","28","29"]

それぞれに対して割合を計算します。

for year in time_series:
    prefecture_df["平成"+year+"年"] = prefecture_df["平成"+year+"年"]/max(prefecture_df["平成"+year+"年"])
prefecture_df.head()

f:id:sammi_baba:20181225070807p:plain

foliumで時系列ヒートマップをプロット

プロット用の3Dデータリストを作成します。

heat_data = [[[row['lat'],row['lon'], row["平成"+year+"年"]] for index, row in prefecture_df.iterrows()] for year in time_series]

そのデータリストを地図の上に追加:

japan_map = folium.Map(location=[35, 135], zoom_start=6)
hm = plugins.HeatMapWithTime(heat_data,index=["平成"+year+"年" for year in time_series],auto_play=False,radius=40,max_opacity=1,gradient={0.1: 'blue', 0.25: 'lime', 0.5:'yellow',0.75: 'red'})
hm.add_to(japan_map)
japan_map

可視化の結果:

f:id:sammi_baba:20181225065010g:plain

よく見ると二つの結論が得られます:

  • 日本の人口は関西と関東に集中しています
  • 東京は一極集中しつつ、地方の人口が減少しています

スポンサーリンク