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

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

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

関連記事

様々な言語モデルを箇条書きで解説

本やWebで調べた自然言語処理における言語モデルやアルゴリズムに関する知識を箇条書きまとめ。 文章の確からしさ 5-gram言語モデル(n-gram言語モデル) n-gram言語モデルは単語の出現確率 …

システムアーキテクチャ設計メソトロジー

システムアーキテクチャ設計のメソトロジー(方法論)をメモ。 目次 アプリケーションの原則とアーキテクチャパターン(Application Principle and Architecture Patt …

kintoneで予算管理アプリを作るまで 〜アプリ実装編〜

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

銀行システムのセキュリティ要件整理

銀行システム/組織のセキュリティ要件を整理する機会がありました。セキュリティはあんまり詳しくないので自分の勉強がてらメモ。 目次 ざっくり結論 各評価項目の定義 セキュリティ要件解説 前提の整理 セキ …

【入門】専門じゃない人のためのデータ分析でよく使う用語まとめ

データ分析とか統計の本を読んでいるとよくでてくる用語で、数学とか統計とかそういう畑を出てない自分にとって馴染みの薄いものを備忘的にまとめていくメモ。 用語 概要 因子 因果関係の原因となる項目。 e. …