忍者ブログ
統計、機械学習、AIを学んでいきたいと思います。 お役に立てば幸いです。

【DS検定対策】画像認識の要!CNNを構成する「2つの層」の役割とは?

画像認識の分野で驚異的な精度を発揮する「畳み込みニューラルネットワーク(CNN)」。その最大の特徴は、画像の特徴を抽出するために特殊な2つの層を交互に積み重ねる構造にあります。

1. 【 問題 】

画像認識などに用いられる「畳み込みニューラルネットワーク(CNN)」は、主にどのような役割を持つ2つの層を交互に積み重ねた構造を指すでしょうか?

① 入力層 と 出力層
② 畳み込み層 と プーリング層
③ 回帰層 と 分類層
④ 活性化層 と 損失層


2. 【 解答 】

正解: ② 畳み込み層 と プーリング層

3. 整理:CNNを支える「2つのエンジン」

CNNは、人間の視覚野の仕組みをモデルにしており、「特徴を見つける作業」と「情報を凝縮する作業」を繰り返します。

【 CNNの構造イメージ 】

[ 1. 畳み込み層 (Convolution Layer) ]
「特徴を抽出する」
フィルタ(カーネル)を画像に滑らせ、エッジ(輪郭)などの特徴を抜き出します。

[ 2. プーリング層 (Pooling Layer) ]
「情報を圧縮・頑健にする」
抽出した特徴の位置ズレを許容し、データを小さくします(Maxプーリングなど)。

--------------------------

このセットを何度も繰り返した後、最後に「全結合層」で何の画像かを分類します。

4. なぜこの構造が必要なのか?

1. 局所的な特徴の把握: 画像全体を一度に見るのではなく、小さな領域(フィルタ)ごとに見ることで、複雑な形を捉えられます。
2. 位置不変性: 対象物が画像の中央にあっても端にあっても、正しく「同じもの」だと認識できるようになります(プーリング層の功績)。


5. DS検定形式:実戦4択クイズ

問:畳み込み層において、画像から特徴を抽出するために使用される小さな行列のことを何と呼ぶか。

① ニューロン   ② カーネル(フィルタ)   ③ バイアス   ④ 重み減衰

【 正解: ② 】

解説: 画像の上をスライドさせながら計算を行う小さな行列を「カーネル」または「フィルタ」と呼びます。このカーネル内の数値を学習によって最適化していくのが、CNNの学習プロセスです。


6. まとめ

DS検定において「CNNの構造」を問われたら、まずは「畳み込み層」と「プーリング層」のセットを思い出しましょう。「畳み込みで特徴を見つけ、プーリングでまとめる」という一連の流れを理解しておくことが、深層学習攻略の第一歩です!





PR

【Kaggle挑戦記】Titanic 攻略 #2:最短ルートで初提出(Submit)まで駆け抜ける

前回、データを読み込むところまで成功しました。今回は精度を一旦度外視し、「最短で予測結果を Kaggle に提出(Submit)すること」を目標にします。分析の世界では、まず一度最後まで通してみることが、全体の流れを把握する近道です。

1. 準備:環境構築とデータの再確認

まずは必要なライブラリの導入と、前回ロードしたデータの状態を再読込して準備を整えます。

[ ターミナルでのインストール ]
conda install scikit-learn

[ ライブラリのインポートとバージョン確認 ]
import pandas as pd
import sklearn
print(sklearn.__version__) # 1.7.2 であることを確認

[ データの読み込み(前回の復習) ]
train_df = pd.read_csv('train.csv')
test_df = pd.read_csv('test.csv')

2. 現状把握:AIの「計算」を阻害する Null を特定する

データを読み込んだら、次にすべきはデータの「健康診断」です。プログラムの演算を停止させたり、予測不能に陥らせたりする「Null(欠損値)」「文字列(Object型)」を特定します。

【 1. Null の確認:isnull() と sum() の組み合わせ 】

データセット内に値が存在しない状態を Null と呼びます。pandas の isnull() 関数を実行すると、全データに対して「Null なら True(1)」「値があれば False(0)」というブール値(論理値)のデータセットが内部で生成されます。

これに sum() を繋げることで、True(1) の数を合計し、各項目にいくつ Null が含まれているかを一気に集計できる仕組みです。

# 各項目に含まれる Null の数を集計
print(train_df.isnull().sum())

[ 実行結果 ]
Age 177 # ← 177件の Null(年齢不明)
Cabin 687 # ← 687件の Null(客室不明)
Embarked 2 # ← 2件の Null(港不明)

→ 数値が入るべき場所に値がない(Null)状態では、AIモデルが数学的な行列演算を行えずエラーとなります。何らかの値で埋めるか、除外する判断が必要です。

【 2. データ型(dtypes)の確認:数値化が必要な項目 】

# データの型を確認
print(train_df.dtypes)

[ 実行結果 ]
Name object
Sex object # ← 文字列型。数値への変換が必須
Embarked object # ← 文字列型。数値への変換が必須

object 型と表示される項目は、そのままではモデルの学習には使えません。

3. 最短の「前処理」:AIが読める形に整える

特定した課題に対し、今回は「最短完走」を優先して以下の処理を施します。object 型のうち、今回の予測に採用する Sex のみ数値に置換します。

# 1. 欠損値を埋める(Fare:運賃 などの空欄を中央値で補完)
# ※学習項目に使わない Age や Cabin の Null は一旦放置します
test_df['Fare'] = test_df['Fare'].fillna(test_df['Fare'].median())

# 2. 文字列を数値に変換(Sex を male=0, female=1 に変換)
# ※Embarked も object型ですが、今回は特徴量に含めないため変換をスキップします
train_df['Sex'] = train_df['Sex'].replace({'male': 0, 'female': 1})
test_df['Sex'] = test_df['Sex'].replace({'male': 0, 'female': 1})

4. 学習と予測:標準モデル「ランダムフォレスト」

予測モデルには、強力で使い勝手の良い RandomForestClassifier を使用します。

from sklearn.ensemble import RandomForestClassifier

# Pclass(チケットクラス)、Sex(性別)、SibSp(兄弟・配偶者数)、Parch(両親・子供数)を使用
# これらは Null がなく、かつ数値化が済んでいる項目です
features = ["Pclass", "Sex", "SibSp", "Parch"]
X = train_df[features]
y = train_df["Survived"]
X_test = test_df[features]

# モデル作成・学習
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)

# 予測実行
predictions = model.predict(X_test)

5. 出力結果の確認:submission.csv の中身

予測が完了すると、Kaggle 提出用の CSV ファイルが生成されます。中身を確認すると、テストデータの乗客(PassengerId 892番〜)に対して、AIが導き出した「生存(1) / 死亡(0)」のフラグが並んでいることがわかります。

PassengerId,Survived
892,0
893,1
894,0
895,0
896,0
897,0
898,1

6. 実践:Kaggle へのアップロードとスコア確認

作成した submission.csv を Kaggle に提出する最終ステップです。

  1. Titanic コンペのページ右上にある青い [Submit Predictions] ボタンをクリックします。
  2. 専用の提出ページに移動するので、画面中央の「Upload files」エリアに submission.csv をドラッグ&ドロップします。
  3. 右下の [Submit] をクリックします。

数秒後、同じ画面上に以下の結果が表示されます。

submission.csv
Complete · Just now
Score: 0.76794

【 自分の順位を確認する 】

提出履歴から Leaderboard(順位表)へ移動し、自分の立ち位置を確認してみましょう。

9065 XXXX(私の登録名)
Score: 0.76794

順位表を見ると、トップ層には Score 1.00000(正解率100%) がズラリと並んでいます。今の自分とはまだ距離がありますが、最短ルートで完走したことで、戦いの舞台には上がりました。ここからロジックを磨き、上位へと食い込んでいきましょう。頑張ろう、エンジニア諸君!

7. 最短完走:全ソースコード

ここまでの手順を一つにまとめた、提出用ファイルを生成するための全コードです。

import pandas as pd
from sklearn.ensemble import RandomForestClassifier

# 1. データの読み込み
train_df = pd.read_csv('train.csv')
test_df = pd.read_csv('test.csv')

# 2. 最小限の前処理
test_df['Fare'] = test_df['Fare'].fillna(test_df['Fare'].median())
train_df['Sex'] = train_df['Sex'].replace({'male': 0, 'female': 1})
test_df['Sex'] = test_df['Sex'].replace({'male': 0, 'female': 1})

# 3. 予測モデルの作成
# 項目:チケットクラス、性別、兄弟配偶者数、親子数(これらはNullなし・数値済み)
features = ["Pclass", "Sex", "SibSp", "Parch"]
X = train_df[features]
y = train_df["Survived"]
X_test = test_df[features]

model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)

# 4. 予測と保存
predictions = model.predict(X_test)
output = pd.DataFrame({'PassengerId': test_df.PassengerId, 'Survived': predictions})
output.to_csv('submission.csv', index=False)

print("Your submission was successfully saved!")

8. まとめ

今回の最短攻略ソースはこれでした!「なぜエラーが出るのか」「何を直すべきか」を特定し、最短で Kaggle にコミットするサイクルを完走しました。これだけで、あなたも立派な Kaggler の仲間入りです。

次回は、今回あえてスルーした「年齢(Age)」の Null をどう埋めるべきか、あるいは「港(Embarked)」をどうモデルに組み込むか。精度向上のための「EDA(探索的データ分析)」に挑戦しましょう!

【Kaggle挑戦記】Titanic 攻略 #1:Mac環境構築とデータロードの第一歩

Kaggle の「Titanic: Machine Learning from Disaster」は、機械学習を学ぶ誰もが通る登竜門です。1912年に起きたタイタニック号の沈没事故を題材に、乗客の「年齢」「性別」「客室の等級」などのデータから、その乗客が生き残るか、それとも犠牲になるか(生存予測)を当てるという、非常に明確な目的を持ったコンペティションです。

今回は、macOS 15.7.4Miniconda 環境(Python 3.13.5)を使い、データを読み込んで分析の土俵に上がるまでの手順を整理していきましょう。

1. 準備:データの入手と配置

【 手順 】 まずは Kaggle の公式サイトにログインし、以下のリンクから Titanic コンペティションのページへアクセスします。

URL: https://www.kaggle.com/competitions/titanic/data

「Data」タブから 「Download All」 をクリックして ZIP ファイルをダウンロードし、作業用フォルダ(例:~/Documents/kaggle_titanic/)に解凍します。中には以下の3つの重要なファイルが入っています。

【 ダウンロードファイルの内訳 】

train.csv : 学習用データ。乗客の属性と「生存(1)・死亡(0)」の正解が含まれています。
test.csv : 予測用データ。このデータに対して、生存・死亡を予測します。
gender_submission.csv : 提出用サンプル。「女性は全員生存、男性は全員死亡」と仮定した、提出ファイルのフォーマット見本です。

2. 深掘り:実装前に「データ定義」を読み解く

コードを書く前に、Data ページにある Data Dictionary をよく読み、各カラム(変数)が何を意味しているかを理解しましょう。これが予測の精度を左右します。

VariableDefinitionKey
survival 生存か否か 0 = No, 1 = Yes
pclass チケットのクラス(社会経済的ステータス) 1 = 1st(Upper), 2 = 2nd(Middle), 3 = 3rd(Lower)
sex 性別
Age 年齢(1歳未満は分数、推定値はxx.5)
sibsp 同乗している兄弟・配偶者の数
parch 同乗している両親・子供の数
ticket チケット番号
fare 旅客運賃
cabin 客室番号
embarked 出港地(乗船した港) C=Cherbourg, Q=Queenstown, S=Southampton

【 ここが分析のヒント! 】

  • 家族構成: sibspparch を合わせることで、「家族連れか、単身か」という新しい特徴が見えてきます。※乳母と同行した子供は parch=0 になるという注意書きも重要です。
  • ステータス: pclass は単なる座席ランクではなく、当時の社会的な地位を反映しています。
  • 推定値: 年齢(Age)に 28.5 のような値がある場合、それは「推定値」であることを意味します。

3. 実装:Miniconda 環境で Python を動かす

今回の環境は Python 3.13.5 です。ターミナルを開き、Miniconda で pandas をインストールしてから、バージョン確認とデータの読み込みを行います。

【 環境構築とコードの実行イメージ 】

[ ターミナルでの準備 ]
conda install pandas
python --version # Python 3.13.5 であることを確認

[ ライブラリのバージョン確認 ]
>>> import pandas as pd
>>> print(pd.__version__)
2.3.3

[ データの読み込み ]
df = pd.read_csv('~/Documents/kaggle_titanic/train.csv')

[ 読み込みの確認 ]
print(df.shape)
# (891, 12)

print(df.head())

[ 実行結果 ]
PassengerId Survived Pclass ... Fare Cabin Embarked
0 1 0 3 ... 7.2500 NaN S
1 2 1 1 ... 71.2833 C85 C
2 3 1 3 ... 7.9250 NaN S
3 4 1 1 ... 53.1000 C123 S
4 5 0 3 ... 8.0500 NaN S

[5 rows x 12 columns]

--------------------------

Mac 上で Titanic の学習用データが正常に展開されました!

4. まとめ

最新の macOS 15.7.4Python 3.13.5 の組み合わせでも、pandas 2.3.3 を使った基本操作は非常にスムーズです。まずは shape でデータの全体像を掴み、head() で「顔」を眺めるところから。これで分析の土俵に上がることができました!

次回は、読み込んだデータの中身を詳しく診察する「健康診断(データの可視化や欠損値の確認)」、そして分析に欠かせないデータの加工(0/1の置き換えなど)に挑戦しましょう。

【DS検定対策】確率の難所を攻略!「結果から原因を遡る」ベイズの定理

「赤玉を引いた」という結果がわかっているとき、それが「どの箱から来たのか」という原因を推測する。これが統計学で非常に重要な「ベイズの定理」の考え方です。図を使って整理していきましょう。

1. 問題:赤玉の正体を探せ

【 問題 】 外見が同じ2つの箱AとBがあります。箱Aには「赤4・白2」、箱Bには「赤2・白4」の玉が入っています。どちらか1つの箱をランダムに選び、玉を1個引いたところ「赤玉」でした。このとき、引いた箱が「箱A」である確率はいくらでしょうか?

① 1/2   ② 2/3   ③ 1/3   ④ 4/6

2. 整理:赤玉が選ばれる「2つのルート」

ベイズの定理のコツは、まず「赤玉が出る全パターン」を分母として書き出すことです。

【 世界の切り出し 】

[ 前提条件 ]
箱を選ぶ確率は、A・Bともに 1/2 です。

[ 全体の世界(分母):赤玉が出る全ルート ]
① 箱Aを選び、赤を引く: (1/2) × (4/6) = 4/12
② 箱Bを選び、赤を引く: (1/2) × (2/6) = 2/12
⇒ 赤が出る合計: 4/12 + 2/12 = 6/12

[ ターゲット(分子):その中で箱Aだった場合 ]
・ルート①の 4/12

--------------------------

確率: (4/12) / (6/12) = 4 / 6 = 2 / 3

3. 計算プロセス

1. 分母を出す: 「箱Aから赤が出る確率」と「箱Bから赤が出る確率」を足して、赤玉が出る全確率(6/12)を求めます。
2. 分子を置く: そのうち、今回のターゲットである「箱A由来の赤玉(4/12)」を分子に置きます。
3. 答えを出す: (4/12) ÷ (6/12) を計算し、約分して 2/3 となります。


4. DS検定形式:実戦4択クイズ

問:事象が起こる前の確率(箱を選ぶ1/2など)を「事前確率」と呼ぶのに対し、新しい情報(赤玉が出た)を得た後に更新された確率を何と呼ぶか。

① 条件付き期待値   ② 事後確率   ③ 尤度(ゆうど)   ④ 帰無仮説

【 正解: ② 】

解説: ベイズの定理によって導き出された「結果を知った後の確率」を「事後確率」と呼びます。データを得るたびに予測の精度を高めていくこの手法は、迷惑メールフィルタやAIの学習モデルなど、現代のデータサイエンスの根幹を支えています。


5. まとめ

「○○という結果のとき、原因が△△である確率」を問われたら、ベイズの定理の出番です。公式を丸暗記するよりも、「赤が出るルートを全部足して分母にする」という図解イメージを持つことで、ケアレスミスを劇的に減らすことができます!



【DS検定対策】セキュリティ攻略:しらばっくれを許さない「否認防止」

情報セキュリティの7要素を順番に解説するシリーズ。今回は、操作が行われた事実を後から否定させない「否認防止」の概念を整理します。

1. 【 問題 】

情報セキュリティの要素の中で、実際にシステムで行った操作や取引に対して、「そんなことはやっていない」と後から否定することを防ぐ特性はどれでしょうか?

① なりすまし防止(真正性)
② 否認防止(Non-repudiation)
③ 証跡保存
④ 実行保存


2. 【 解答 】

正解: ② 否認防止(Non-repudiation)

3. 整理:操作の事実を「証明」する世界

否認防止とは、いわば「デジタルな証拠」を確実に残し、第三者から見てもその事実を覆せなくすることです。

【 否認防止のイメージ 】

[ 1. 操作の発生 ]
「AさんがBさんに100万円振り込む」というボタンを押した。

[ 2. 証拠の固定 ]
デジタル署名やタイムスタンプが付与され、操作の内容と時刻がロックされる。

[ 3. しらばっくれの発生 ]
後日、Aさんが「そんな操作はしていない」と主張する。

[ 4. 第三者による検証 ]
★ ここが否認防止!
記録された証拠を照合し、「間違いなくAさんが操作した」ことを客観的に証明する。

--------------------------

ポイント: 真正性(本人の証明)と密接に関わりますが、その「事実を否定させない」という証拠能力に注目したものが「否認防止」です。

4. 代表的な技術手段

1. デジタル署名: 公開鍵暗号基盤(PKI)を用いて、誰がデータを作成したかを証明する。
2. タイムスタンプ: 第三者機関(時刻認証局)が、その時刻にデータが存在したことを証明する。
3. ログの改ざん防止: 記録そのものが書き換えられないよう、WORM(一度だけ書き込み可能)メディアなどに保存する。


5. DS検定形式:実戦4択クイズ

問:デジタル署名において、送信者が「確かにそのメッセージを送信した」ことを第三者が検証できるようにすることで実現されるセキュリティ特性はどれか。

① 機密性   ② 可用性   ③ 否認防止   ④ 信頼性

【 正解: ③ 】

解説: デジタル署名の主な役割は「真正性の確保(本人の証明)」と「否認防止(送信した事実の証明)」です。「やっていない」という主張を無効化する力が問われたら、否認防止を選びましょう。


6. まとめ

DS検定の用語問題では、「否定することを防止する」「事実を証明する」という表現が出てきたら「否認防止」が正解です。選択肢に似たような言葉(証跡保存など)が並んでも、国際標準(ISO/IEC 27000)で定義された「否認防止」というキーワードをしっかり選び抜きましょう!