とあるエンジニアの作業ブログ

Data Analytics Python コンサル 機械学習

Pythonほぼ初心者が作る画像分類評価 ~多ラベル分類編~

投稿日:

Python初心者に毛が生えた程度の筆者が画像分類の評価をした時のお話。
ただのPython文法メモ的な。

分類問題設定

1000枚ぐらいある画像に対してラベル分類する問題です。
1枚にscore付きで複数ラベル出てくるのですが、一定の閾値を設けてそれ以上のラベルを採用 = 多ラベル分類 という問題設定で評価しました。

やりたいことがほぼ同じだったので、Qiitaのこちらの記事のやり方をパクりました。

動作環境

  • runtime ··· Google Colaboratory
  • DB ··· BigQuery

BigQueryにすでに正解データとMLモデルによる予測結果が入っている状態からスタートです。

正解データ ※画像3は該当するラベルなしを明示的に識別できるようにNoneという文字列が入っているとする

img_name label
画像1 ラベル1
ラベル2
画像2 ラベル3
画像3 None

予測結果 ※imagesはSTRUCT型の配列(オブジェクト配列)です。labelとscoreをプロパティにもつ

img_name images.label images.score
画像1 ラベル1 0.9
ラベル2 0.8
ラベル3 0.3
ラベル4 0.2
ラベル5 0.1
画像2 ラベル3 0.9
画像3 ラベル1 0.1
ラベル2 0.1
ラベル3 0.1

作った物

自分的文法メモ

BigQueryの認証、BQクライアントの用意

auth.authenticate_user()

ここでブラウザが起動してBigQueryに接続するための認証が走る(認証コードをコピペ入力する)。

client = bigquery.Client(‘[GCPプロジェクト名]’)

公式では'[GCPプロジェクト名]'はなくてもSQLのFROM句に直接記載すれば良さげだったけどうまくいかなかったので記載。

ほげほげのDataFrameを作成

sql = “””
SELECT hogehoge
FROM """ + predicition_tbl + """
“””
df = client.query(sql).to_dataframe()

ライブラリimportしているBigQuery接続ライブラリfrom google.cloud import bigqueryを使っている。
ライブラリ関係ないけど"""は改行込み文字列。
文字列連結はあってるのかわからんけど上のように書いたらできた。

%%bigquery –project {GCPのProjectID} df
SELECT文

というマジックコマンドも使えるらしいが、その場合、

  • SQLの中にどうやって変数含めるのかよくわからんかった
  • そもそもソースコードの中に埋め込めるのかよくわからんかった(for文で回したいので)

という理由で素直にライブラリでやりました。

0.01刻みの配列(イテレートオブジェクト)

x_score = [i / 100 for i in range(0, 100, 1)]

range()関数ですぐできると思いきや、range()は引数intしかダメらしい。
一般的に上のように内包表記するらしい。
range()は第一引数〜第二引数まで間隔=第三引数の配列を返してくれる関数。

データフレームのindexの値取得

dft.index.values

戻り値は配列(だったと思う)

集合(set型)から要素削除

if ‘None’ in seikaisyugou:
seikaisyugou = seikaisyugou.remove(‘None’)
if seikaisyugou is None:
seikaisyugou = set()

remove()を使う。ただし集合内に削除対象の要素が含まれてないとエラーになる。
最初はdiscard()を使っていたが、こちらは集合内に削除対象の要素がなくてもエラーにならない代わりに戻り値が空集合になる。
参考にしたサイトの情報が間違っていてめちゃハマった。

データフレームを検索して一致する行のindexを返す

dfy.query(‘img_name == @imgname’).index

df.query('hogehgoe [比較演算子] honyahonya')で検索可能。
変数を使いたければ@らしい。
.indexの戻りはNumPyの配列だったと思う。通常のリストではないので注意

データフレームの特定の行、列の値を取得

imgname = dft.loc[index,’img_name’]

df.loc[index, カラム名]。PK相当のカラムがあるテーブルならそいつをダイレクトに指定して取得することはできるのだろうか?
それとも上述のようにquery()で絞ってそいつのindexを取得してloc[]でアクセスするのが普通なのだろうか?

積集合、差集合、その他諸々集合演算

全てはここにある。

グラフ出力

df = pd.DataFrame({‘score’: x_score, ‘precision’: l_precision, ‘recall’: l_recall})
df.plot(x=’score’)

pandasのplot()でできる。裏はmatplotlibなのかな?(エラった時のstacktrace見たらそんな感じだった。知らんけど)
plot()の引数なしだと、

  • x軸 = dataframeのindex
  • y軸 = dataframeの各カラム(全てのカラムがプロットされる)

なので、今回のようにx軸を特定カラムにしたい場合はx='[カラム名]'で指定してあげる。

-Data Analytics, Python, コンサル, 機械学習
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

kintoneで予算管理アプリを作るまで 〜ユーザー・権限管理編〜

仕事でkintoneを使って予算管理を行えないか!?的な話に巻き込まれた。 kintoneなんて使ったこともないし、今後も使うつもりはないが、一応フィジビリティしたのでメモ。 ユーザ・権限管理とアプリ …

リスクベースドテストにおけるリスク定義方法

リスクベースドテストにおけるリスク定義方法のメモ。 主に、リスク定義する上でのリスク算出要因(影響度(Damage), 発生確率(Probability of Failure))と重みづけ方法、及びリ …

筑波大学 佐久間 淳先生の機械学習講義の学習メモ ~ 第1回 機械学習概論と単回帰 (2) ~

筑波大学 システム情報系教授 佐久間 淳先生の機械学習の講義を見て勉強したので学習メモ。 第2回 1. 機械学習概論と単回帰 (2)。 用語メモ 平均二乗誤差 一つのデータに対する Error(誤差) …

『統計学が最強の学問である』を読んで自分用メモ

西内啓さんの「統計学が最強の学問である」を読んで自分用のメモ。 自分用なのでかなり偏ってます。 目次 データをビジネスで使うための「3つの問い」 サンプリング収集したデータが十分であるかどうかを検証す …

【初心者向け】Pythonで初めてのスクレイピング

Python学習中のためスクレイピングをやってみる。 すでに山ほど参考サイトがあるが、以下がソースも短くライトそうなので拝借し、本家はBeautifulSoupを使っているところをpyqueryに改造 …