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の概念と内容をしっかり覚えること↓
➁そして、理解を深めるために、Azure の無料アカウント作ってランニングパスのコード実践してみました。
(Azureの無料アカウントは最初に¥22,500のクレジット付与されますので、気軽に試すことができます↓)
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点を超えました↓
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ランニングパスに沿ってもう一度復習しました↓
(この部分はおよそ2週間かかった)
試験対策
試験5日前に、下記の本を買って一度模擬試験してました。
(この部分はおよそ2日間かかった)
試験
当日は自宅でオンライン試験受けていました。
(身分証明を事前に用意し、30分前からチェックインできる)
大体50問くらいがあって、すべてが選択肢ある問題です。
難易度はそれほど高くなくて、30分ほどで試験を解き切ってしまいました。
試験終わったら、その場で結果が分かります。
試験結果
一瞬結果出るので、ドキドキしてたけど無事に800点を超えました↓
続編、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+上がってしまうという欠点について説明してみました:
というわけで、不均衡データ(imbalanced data)におけるモデル評価する時に、指標としてはマシューズ相関係数(Matthews Correlation Coefficient)とF1_Score使用した方がマシです。今回はMCCとF1_Scoreについて紹介し、さらに両者の違いを比較します。
MCCとF1_Scoreの紹介
F1_Scoreは分類モデルの評価指標の一つで、precisionとrecall両方とも考慮して、調和平均でスコアを計算します。ある程度precisionとrecallのバランスを表しています。スコアの範囲は最悪0~最善1まで。F1_Scoreの公式は下記の通り:
ちなみに、一般式としてFbeta_Scoreがあります:
F1_Scoreはbeta=1の場合です。
同じく、F2_Score, F3_Score。。も存在しています。
betaというのは全公式の重みで、betaが大きければ、pecisionの重みが小さく、recallの重み大きくになります。
MCC真陽性(TP),偽陽性(FP),真陰性(TN),偽陰性(FN)を全部考慮したうえで、クラスのサイズが非常に異なっていても使用できる分類モデルの評価指標です。
本質的にというと、MCCは予測された二値分類結果と実際結果の相関係数です。つまり予測と答えはどれだけ近いか測るための尺度で、値の範囲は最悪-1~最善1まで。+1は完璧な予測結果、0はランダム予測結果、−1は予測結果と実際結果が完全な不一致を表しています。MCCの公式は下記の通り:
不均衡データにおける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()
プロットの結果:
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()
プロットの結果:
Negativeは少数クラスの場合には、F1_scoreとMCCが似たような動きをしていないです。 なぜならば、F1_scoreは正負クラスの定義に影響されます。逆に、MCCは正負クラスをどう定義するかに依存せず、同じ動きを取ります。
まとめ
○ 不均衡データにおけるモデル評価指標としては、MCCとF1_scoreがおすすめです。
○ F1_scoreは正負クラスの定義に影響されやすい。
○ MCCは一番安全です。
不均衡データ - ROC曲線欠点の実装例
目次:
はじめに
前回はROC AUCの欠点に関して少し言及しましたが、
今回は実装例に基づいて、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)
AUC:0.920 ! めちゃ良いモデルと思われがちですが、実はそうではない:
predictions = model.predict(testX)
print(classification_report(testy, predictions))
少数クラスの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)
AUC:0.895 !
predictions = model.predict(testX)
print(classification_report(testy, predictions))
少数クラスのrecallとf1_scoreわずか0.4, 0.5くらい!
というわけで、不均衡データの分類モデルを評価する際に、絶対ROC_AUC曲線を信じちゃダメです〜それより評価指標としてMCCやF1_scoreの方が良いです。
次回は不均衡データにも適切に評価できるマシューズ相関係数(Matthews Correlation Coefficient)とF1_scoreについて紹介と比較したいと思います、ぜひご覧ください:
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
そこで、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)
P(x)>threshold -> Postive
緑線は理想モデルの結果、青線はランダムモデルの結果、普通に作られたモデルは赤線のように緑線と青線の間に描かれっています。
しきい値が1の場合に、予測結果は全てNegativeになってしまって、ROC曲線は必ず(0,0)に通過します。
しきい値が0の場合に、予測結果は全てPostiveになってしまって、ROC曲線は必ず(1,1)に通過します。
AUC(Area under curve)というのはROC曲線以下に囲まれた面積です。緑線は正方形で面積は1、青線は三角形で面積は0.5、普通に作られたモデルのAUCは下記のように0.5~1の間です:
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()
プロットの結果:
繋がっている点の数が増えたらもっと滑かになるはずですが、今回は中途半端になってしまいました。
ROC_AUC曲線の欠点
ROC_AUC曲線は評価指標として分類モデルのパフォーマンスをよく反映できますけれども、不均衡データに対してしばしば簡単に0.90+上がってしまうという欠点があります。不均衡データの分類モデルを評価する際に、絶対ROC_AUC曲線を信じちゃダメです〜
次回は実装例に基づいてこういう欠点に関して説明します。ぜひご覧ください:
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()
そして、都道府県別のGeocodeいわゆる緯度と経度の情報も必要なので、以下のGithubからダウンロードします:
geo_df = pd.read_csv("prefecturalCapital.csv", encoding="utf-8") geo_df.head()
フォーマットを揃え
紐付けのために、データのフォーマットを揃えないといけない。
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()
そして、タイムインデックスを作ります。
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()
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
可視化の結果:
よく見ると二つの結論が得られます:
- 日本の人口は関西と関東に集中しています。
- 東京は一極集中しつつ、地方の人口が減少しています。