読み込み中...

10ステップで学ぶ!Pythonと機械学習初心者向け完全ガイド

Pythonと機械学習の初心者向けガイドの表紙画像 Python
この記事は約30分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Pythonで機械学習を学ぶなら、文法、データ処理、モデル作成、評価、注意点を同じ流れで押さえると理解しやすくなります。初心者がつまずきやすいのは、プログラミングの文法だけを覚えても、データをどう整え、どのモデルへ渡すのかがつながりにくい点です。

そのため、最初は小さなサンプルコードで変数リスト関数DataFramefitpredictの役割を確認し、少しずつ機械学習の処理へ進む構成が扱いやすいでしょう。公式ドキュメントによれば、Pythonは読みやすい構文を重視した言語であり、データ分析や機械学習のガイドでも広く採用されています。

動作確認環境
  • Python 3.14.6 / pip
  • NumPy 2.4 / pandas 3.0.3 / scikit-learn 1.9.0
  • Matplotlib 3系 / TensorFlow Keras API
📖 この記事で学べること
  • Pythonの特徴と、初心者が最初に押さえる構文
  • 機械学習で使うデータの読み込み、加工、可視化
  • 分類、回帰、クラスタリングの考え方とサンプルコード
  • ニューラルネットワーク、CNN、RNNの入口
  • 学習データ、評価、パラメータ調整で起きやすい問題への対処

Pythonの学習を広げる際は、基礎文法を扱うPython初心者のための完全ガイドや、表形式データを扱うPythonで表を操作するための詳細ガイドも合わせて確認すると、プログラミングとデータ処理の接続が整理できます。グラフ作成ではPythonで折れ線グラフ作成の完全ガイドが参考になるでしょう。

Pythonとは

Pythonは、シンプルな構文と豊富なライブラリを特徴とする汎用プログラミング言語です。Web開発、業務自動化、データ分析、機械学習まで同じ言語で扱えるため、初心者が最初に学ぶ言語として選ばれる場面も多いと言えます。

一般に、Pythonのコードは{}ではなくインデントで処理のまとまりを表するのが基本です。この書き方は行数が増えても構造を追いやすく、iffordefの範囲が視覚的に分かるのが特徴です。

公式のPython Tutorialでは、対話的に動かしながら文法を学べる構成が示されているのが基本です。プログラミングに慣れていない初心者でも、printで値を表示しながら進めると、変数や条件分岐の動きがつかみやすくなるでしょう。

Pythonの特徴

これらの特徴の中で特に押さえたいのは、読みやすさ、ライブラリの多さ、学習資料の多さです。たとえば数値計算ならNumPy、表形式データならpandas、グラフならMatplotlib、機械学習ならscikit-learnという選択肢があります。

その組み合わせにより、ファイルを読み込み、データを整え、モデルへ渡し、結果を評価する流れをPythonだけで書けるのが目安です。初心者向けのガイドでPythonが取り上げられやすいのは、この一貫性が学習の負担を下げるためです。

Pythonのインストール方法

基本的には、Python公式サイトからインストーラを入手し、OSに合わせて導入します。Windowsではインストール時にPATHへ追加する設定を有効にしておくと、ターミナルからpythonpipを呼び出しやすくなるのが目安です。

一方、機械学習を中心に学ぶ場合は、仮想環境を作ってライブラリを分ける方法が現実的です。python -m venvで環境を分離し、必要なnumpypandasscikit-learnpip installで追加すると、プロジェクトごとの依存関係を管理できるのがポイントです。

💡 Tips: 学習用の小さなサンプルコードでも、仮想環境を使うとライブラリのバージョン差による混乱を減らせます。

Pythonの基本構文

Pythonの基本構文は、機械学習のサンプルコードを読む土台になります。intfloatstrboolのような型、複数の値を扱うlisttuple、処理をまとめるdefを押さえると、データ処理の流れが追いやすくなるのが一般的です。

具体的には、値を入れる変数、条件で分けるif、繰り返すforwhile、処理を再利用する関数が中心です。これらはプログラミング全般で使う考え方であり、Pythonによる機械学習でも頻繁に登場するのがポイントです。

構文早見表

分類書き方主な役割機械学習での使いどころ注意点
変数x = 10値に名前を付ける特徴量やラベルを保持する中身が変わる前提で読む
整数int整数を扱う件数やクラス番号に使う割り算では型に注意する
小数float小数を扱う損失値や確率を扱う丸め誤差を理解する
文字列str文字を扱う列名やカテゴリ名に使う数値との混在に注意する
真偽値bool真偽を表す条件分岐に使うTrueFalseは大文字始まり
リスト[1, 2, 3]順序付きの値を持つ小さなデータ列を扱う変更可能である
タプル(1, 2)変更しない値を持つ形状や座標を表す要素の変更はできない
辞書{"a": 1}キーと値を結び付ける設定値やパラメータを持つキー名の重複に注意する
条件分岐if条件で処理を変える欠損値や分類結果を判定するインデントをそろえる
繰り返しfor要素を順に処理する列やファイルを順に扱う大量データでは専用関数も検討する
条件反復while条件中だけ繰り返す反復処理を表せる終了条件を明確にする
関数def処理を再利用する前処理をまとめる入力と戻り値を決める
戻り値return結果を返す加工後データを返す複数値はタプルで返る
追加appendリスト末尾へ追加する結果の蓄積に使う大量処理では効率を考える
範囲range連番を作る反復回数を表す終端値は含まれない
読み込みimportライブラリを使うNumPyなどを呼び出す別名の慣習を確認する
配列np.array数値配列を作る特徴量行列を扱う次元を意識する
DataFrame行列状データを扱うCSVの加工に使う列の型を確認する
CSVread_csvCSVを読む学習データを読み込む文字コードに注意する
先頭確認head先頭行を見る読み込み確認に使う全体の品質は別途確認する
情報確認info型や欠損を見る前処理方針を決める戻り値ではなく表示中心
欠損削除dropna欠損行を除く学習前の整形に使う削除しすぎに注意する
平均mean平均値を計算する概要把握に使う外れ値に影響される
中央値median中央値を計算する分布把握に使うカテゴリ列には使えない
描画plotグラフを描く傾向確認に使う軸ラベルを付ける
表示show図を表示する可視化結果を見る環境により表示方法が異なる
分割train_test_split訓練用と評価用へ分ける性能評価に使う乱数固定を検討する
学習fitモデルを学習させる特徴量と正解を渡す訓練データだけに使う
予測predict予測値を出す未知データを分類する入力形状をそろえる
評価accuracy_score正解率を計算する分類モデルを評価する不均衡データでは別指標も見る

変数と型

Pythonは動的型付けの言語なので、変数を作るときに型名を明示しなくても値を入れられます。ただし、機械学習では数値として扱う列と文字列として扱う列の違いがモデル入力に影響するため、型を意識しないまま進めるとエラーの原因になります。

このとき、typedf.dtypesで型を確認する習慣を付けると、データ読み込み後の混乱を減らせますし、ここがポイントです。プログラミングの基礎として型を覚えるだけでなく、どの処理に渡せる値なのかまで見ると実用的です。

リストとタプル

リストは後から要素を増減できる入れ物で、タプルは作成後に内容を変えない入れ物です。サンプルコードでは、小さな数値列をlistで持ち、画像サイズや入力形状のような固定値をtupleで表す書き方がよく出てきますし、ここがポイントです。

一方、機械学習の実データでは、Pythonのリストだけで大規模な計算を進めるより、ndarrayDataFrameへ変換するほうが扱いやすくなります。リストは基礎を理解するための入口、配列や表は分析処理の中心と整理できるのが現実的です。

制御文 if・for・while

ifは条件によって処理を分け、forはリストや行を順に処理し、whileは条件が成り立つ間だけ処理を続けます。これらは小さなプログラミング課題だけでなく、データの検査や前処理の補助にも使われますが、これは押さえたい点です。

ただし、表形式データではforで1行ずつ処理するより、pandasの列操作を使うほうが読みやすい場合があると整理できます。初心者は最初に制御文で動きを理解し、慣れてきたらライブラリの書き方へ広げるとよいでしょう。

関数の定義と使用

関数は、同じ処理を名前付きで再利用する仕組みです。機械学習では、欠損値処理、カテゴリ変換、評価指標の計算などを関数にまとめると、サンプルコードが長くなっても流れを追いやすくなります。

具体的には、defで関数を作り、必要な値を引数として受け取り、returnで結果を返するのが一般的です。関数の入力と出力を先に決めると、データ処理とモデル処理を分けて考えられるようになるはずです。

サンプルコード1:基本構文の使用例

このサンプルコードでは、整数のリストから偶数だけを取り出すると理解できます。forで要素を順に見て、ifで条件を判定し、条件に合う値だけをappendで別のリストへ追加する流れです。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
even_numbers = []

for n in numbers:
    if n % 2 == 0:
        even_numbers.append(n)

print(even_numbers)

結果: 期待される出力は[2, 4, 6, 8]です。

この例では、リスト、繰り返し、条件分岐、表示の関係が短いコードで確認できます。基礎構文の読み書きに慣れると、機械学習のガイドに出てくる前処理コードも理解しやすくなるでしょう。

機械学習とは

機械学習は、データから規則性を学び、未知のデータに対して予測や分類を行うための技術です。人が細かな条件をすべて書くのではなく、過去データを使ってモデルが判断の基準を作る点に特徴があります。

一般に、迷惑メール判定、商品の推薦、需要予測、画像分類、音声認識などで利用されますが、これは押さえたい点です。初心者が理解しやすい例としては、花の大きさから種類を分類する、過去の数値から将来の値を予測する、といった問題が挙げられますし、これが一つの目安です。

機械学習の種類

機械学習は、教師あり学習、教師なし学習、強化学習に大別できます。教師あり学習は正解ラベルを使って予測方法を学び、教師なし学習は正解ラベルなしでデータの構造を探し、強化学習は報酬を手がかりに行動を選びますし、これが一つの目安です。

その違いは、手元のデータに正解があるかどうかで判断できます。売上予測や画像分類のように正解があるなら教師あり学習、顧客のグループ分けのように構造を探るなら教師なし学習が候補になると整理できるのが現実的です。

機械学習の流れ

機械学習の流れは、問題を決める、データを集める、前処理する、モデルを選ぶ、学習させる、評価する、改善する、という順で考えると分かりやすいです。実務的な分析では一直線に進むより、評価結果を見てデータ処理や特徴量設計へ戻ることが多くなると覚えるとよいでしょう。

このとき、最初から複雑なモデルへ進むより、単純なモデルで基準を作るほうが原因を切り分けやすいでしょう。scikit-learn User Guideにも、分類、回帰、クラスタリングなどの主要な手法が体系的に整理されています。

ℹ️ 補足: 機械学習の評価は、訓練データへの当てはまりだけでは判断できません。未知データに対する性能を見るため、訓練用と評価用に分ける考え方が欠かせません。

Pythonでのデータの扱い方

Pythonで機械学習を行う前に、データを読み、整え、可視化する力が必要になります。モデルそのものより前処理で結果が大きく変わるため、初心者はライブラリの名前だけでなく、何のために使うのかを結び付けて理解するとよいでしょう。

具体的には、数値配列はNumPy、表形式データはpandas、グラフはMatplotlibを使うのが一般的です。NumPy公式のNumPy user guideやpandas公式のpandas User Guideも、学習中に確認する一次情報として役立ちますが、覚えておくと役立つでしょう。

NumPyの使い方

NumPyは、多次元配列ndarrayを中心に数値計算を行うライブラリです。機械学習では特徴量を行列として扱う場面が多く、np.arrayで配列を作る感覚に慣れておくと、モデル入力の形を理解しやすくなります。

その配列は、同じ形の配列どうしなら足し算や引き算をまとめて処理できます。サンプルコードでは、2つの2行2列の行列を作り、和と差を計算すると考えられますが、覚えておくと役立つでしょう。

import numpy as np

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

C = A + B
D = A - B

print(C)
print(D)

結果: 期待される出力は、和が[[6, 8], [10, 12]]、差が[[-4, -4], [-4, -4]]です。

この例では、配列全体へ一度に演算が適用されています。Pythonのforで要素を一つずつ処理するより、配列演算として書くほうが意図を読み取りやすい場面が多いでしょう。

pandasの使い方

pandasは、行と列を持つ表形式データを扱うためのライブラリです。CSVから読み込んだデータはDataFrameとして扱われ、列名で値を取り出したり、欠損値を調べたりできます。

このサンプルコードでは、sample.csvを読み込み、先頭行と基本情報を確認すると言えるでしょう。ファイルが存在しない環境では動かないため、同じフォルダにCSVを置く前提です。

import pandas as pd

df = pd.read_csv("sample.csv")

print(df.head())
print(df.info())

結果: 期待される出力は、CSVの先頭行と、行数・列数・各列の型などの概要です。

この確認によって、数値列として扱える列、文字列のまま残っている列、欠損を含む列が見えてきます。機械学習に渡す前にinfoheadを見る習慣は、データの思い違いを減らします。

Matplotlibの使い方

Matplotlibは、折れ線グラフ、棒グラフ、ヒストグラムなどを描くライブラリです。データを数値だけで見ていると分布や外れ値に気づきにくいため、グラフで形を確認することがデータ理解につながりますし、ここを基本と考えるとよいでしょう。

このサンプルコードでは、月ごとの平均気温を折れ線グラフとして描きますし、ここを基本と考えるとよいでしょう。グラフの基本を押さえた後は、折れ線グラフ作成の記事で軸や凡例の調整も確認できます。

import matplotlib.pyplot as plt

months = range(1, 13)
temperature = [5, 7, 10, 15, 20, 23, 27, 26, 22, 17, 12, 8]

plt.plot(months, temperature)
plt.title("Average Temperature")
plt.xlabel("Month")
plt.ylabel("Temperature")
plt.show()

結果: 期待される表示は、横軸が月、縦軸が平均気温の折れ線グラフです。

このグラフでは、夏に値が上がり、冬に下がる傾向を視覚的に読み取れます。機械学習の前処理でも、分布や偏りを確認するために可視化を組み合わせると判断しやすくなるでしょう。

データ分析の基本

データ分析では、平均値、中央値、最大値、最小値を確認するだけでも、列の規模感や異常値の候補が見えてきます。pandasの集計メソッドを使うと、複数列に対して同じ処理をまとめて実行できるのが基本です。

import pandas as pd

df = pd.read_csv("sample.csv")

print(df.mean(numeric_only=True))
print(df.median(numeric_only=True))
print(df.max(numeric_only=True))
print(df.min(numeric_only=True))

結果: 期待される出力は、数値列ごとの平均値、中央値、最大値、最小値です。

この集計は、モデルへ入れる前のデータ確認に使えると整理できます。ただし、平均値だけでは外れ値に引っ張られる可能性があるため、中央値や分布の形も合わせて見るのが現実的です。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("sample.csv")

df["age"].hist(bins=10)
plt.xlabel("age")
plt.ylabel("count")
plt.show()

結果: 期待される表示は、age列の値を10区間に分けたヒストグラムです。

このとき、特定の範囲に値が極端に偏っていないかを確認できます。表の操作に慣れていない場合は、Pythonで表を操作するためのガイドで列選択や集計の書き方を補うとよいでしょう。

Pythonによる機械学習

Pythonによる機械学習では、データの読み込み、前処理、分割、モデル作成、学習、予測、評価を順に組み立てますし、ここがポイントです。scikit-learnを使うと、分類や回帰のモデルを共通した書き方で扱えるため、初心者でも処理の流れを比較しやすくなります。

具体的には、train_test_splitで訓練用と評価用に分け、model.fitで学習し、model.predictで予測すると理解できます。この形を覚えると、LogisticRegressionRandomForestClassifierKMeansなどに切り替えても全体像を見失いにくいでしょう。

Irisデータセットで分類を試す

Irisデータセットは、花びらやがく片の長さから品種を分類する学習用データです。小さく整ったデータなので、機械学習のサンプルコードでは分類の流れを確認する題材としてよく使われますが、これは押さえたい点です。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

iris = load_iris()
X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
print(accuracy_score(y_test, y_pred))

結果: 期待される出力は、テストデータに対する分類の正解率を表す小数です。

この正解率は1に近いほど正解した割合が高いことを示します。ただし、評価値だけを見て良し悪しを断定せず、データの分け方、クラスの偏り、評価指標の種類も合わせて確認する必要があります。

線形回帰モデルの訓練

線形回帰は、入力値と予測したい値の関係を直線的に近似する回帰モデルです。古いサンプルで見かけるload_bostonはscikit-learnから削除済みのため、現行の学習例ではfetch_california_housingなどを使いるのが目安です。

⚠️ 注意: load_bostonは倫理面とデータ品質の問題により削除済みです。古い記事のコードをそのまま使うのではなく、現行APIの代替データセットを選びますし、ここがポイントです。
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

housing = fetch_california_housing()
X = housing.data
y = housing.target

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

model = LinearRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
print(mean_squared_error(y_test, y_pred))

結果: 期待される出力は、予測値と正解値のずれを表す平均二乗誤差です。

平均二乗誤差は小さいほど予測と正解の差が小さいことを示します。一方で、値の大きさは目的変数の単位に左右されるため、別モデルとの比較やベースラインとの比較で読むのが自然です。

new_data = [X_test[0]]
price_pred = model.predict(new_data)
print(price_pred)

結果: 期待される出力は、入力した特徴量に対する住宅価格指標の予測値です。

この例のnew_dataは、評価用データの先頭行を使っています。実際に独自データを渡す場合は、学習時と同じ列順、同じ前処理、同じ単位にそろえる必要があるのがポイントです。

分類問題とランダムフォレスト

ランダムフォレストは、複数の決定木を組み合わせて分類や回帰を行う手法です。単独の決定木より過学習を抑えやすく、前処理が比較的少ない状態でも試しやすいモデルとして使われますが、これは押さえたい点です。

このサンプルコードでは、Irisデータセットを使って花の種類を分類します。Pythonによる機械学習の最初の比較対象として、ロジスティック回帰とランダムフォレストを並べて動かすと違いをつかみやすいでしょう。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

iris = load_iris()
X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
print(accuracy_score(y_test, y_pred))

結果: 期待される出力は、ランダムフォレストによる分類の正解率です。

その値は、テストデータで正しく分類できた割合を示します。分類では正解率だけでなく、どのクラスを間違えやすいかを見るために混同行列を確認することもあります。

new_data = [[5.1, 3.5, 1.4, 0.2]]
species_pred = model.predict(new_data)
print(species_pred)

結果: 期待される出力は、新しい花の特徴量に対するクラス番号です。

このクラス番号は、iris.target_namesと対応させると品種名として読めるのが一般的です。出力が数値で返るモデルでは、番号とラベルの対応を失わないように扱うことが大切です。

クラスタリングとK-means法

クラスタリングは、正解ラベルがないデータを似たもの同士のグループへ分ける方法です。K-meansは、指定したクラスタ数に従って中心点を更新しながらデータを分ける代表的な手法になります。

このサンプルコードでは、人工的に作った2次元データへKMeansを適用します。グラフで色分けして表示すると、教師なし学習の考え方が視覚的に理解できるのが現実的です。

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

X, _ = make_blobs(
    n_samples=150,
    n_features=2,
    centers=3,
    cluster_std=0.5,
    random_state=0
)

model = KMeans(n_clusters=3, random_state=0, n_init="auto")
model.fit(X)
y_pred = model.predict(X)

plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

結果: 期待される表示は、3つのクラスタに色分けされた散布図です。

ただし、K-meansはクラスタ数を先に決める必要があります。クラスタの形が複雑な場合や、外れ値が多い場合には、別のクラスタリング手法を検討したほうがよいかもしれません。

from sklearn.cluster import DBSCAN

model = DBSCAN(eps=0.5, min_samples=5)
y_pred = model.fit_predict(X)

plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

結果: 期待される表示は、DBSCANで推定されたクラスタごとに色分けされた散布図です。

DBSCANは密度に基づいてクラスタを見つけるため、クラスタ数を事前に決めない点がK-meansと異なります。一方で、epsmin_samplesの値によって結果が変わるため、データの尺度を確認しながら調整する必要があります。

ニューラルネットワークの構築

ニューラルネットワークは、層を重ねて入力から出力への変換を学習するモデルです。Keras APIを使うと、SequentialDense層を追加して、全結合型のモデルを組み立てられますし、これが一つの目安です。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential()
model.add(Dense(128, input_shape=(100,), activation="relu"))
model.add(Dense(64, activation="relu"))
model.add(Dense(64, activation="relu"))
model.add(Dense(10, activation="softmax"))

結果: 期待される状態は、100次元の入力から10クラスの確率分布を出すモデル構造が作られることです。

このモデルでは、隠れ層にrelu、出力層にsoftmaxを使っています。多クラス分類では、出力が各クラスの確率として解釈できる形になるため、ラベル形式や損失関数との対応を確認する必要があります。

model.compile(
    loss="categorical_crossentropy",
    optimizer="adam",
    metrics=["accuracy"]
)

# X_train と y_train は別途用意した学習データを想定
# model.fit(X_train, y_train, epochs=20, batch_size=128)

結果: 期待される状態は、モデルに損失関数、最適化手法、評価指標が設定されることです。

このコードでは学習データの定義を省いているため、fit行はコメントにしていると整理できると覚えるとよいでしょう。実際に動かすには、入力形状が(100,)に合うX_trainと、10クラスに対応したy_trainを用意します。

画像分類問題とCNN

CNNは、画像の局所的な特徴を畳み込みで抽出し、プーリングで情報量を圧縮するニューラルネットワークです。画像分類では、Conv2DMaxPooling2DFlattenDenseを組み合わせる構成がよく使われます。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

model = Sequential()
model.add(Conv2D(32, (3, 3), activation="relu", input_shape=(64, 64, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation="relu"))
model.add(Dense(1, activation="sigmoid"))

結果: 期待される状態は、64×64のカラー画像を入力し、二値分類の出力を返すCNN構造が作られることです。

この構成では、最後のsigmoidが0から1の値を返します。犬と猫のような二値分類では使いやすい形ですが、3クラス以上の分類では出力ユニット数と活性化関数を変える必要があります。

model.compile(
    optimizer="adam",
    loss="binary_crossentropy",
    metrics=["accuracy"]
)

# X_train と y_train は画像データとして別途用意
# model.fit(X_train, y_train, epochs=25, batch_size=32)

結果: 期待される状態は、二値分類用の損失関数と評価指標がモデルに設定されることです。

このサンプルコードは構造の理解を目的にしていると理解できると考えられます。画像データは画素値の正規化、ラベルの形式、訓練用と検証用の分割をそろえてから学習へ進める必要があります。

自然言語処理とRNN

RNNは、時系列や文章のように順序を持つデータを扱うニューラルネットワークです。現在はTransformer系モデルが広く使われる場面もありますが、系列データの基礎を理解するうえでRNNの考え方は役立ちます。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, SimpleRNN, Dense

model = Sequential()
model.add(Embedding(input_dim=10000, output_dim=32))
model.add(SimpleRNN(32))
model.add(Dense(1, activation="sigmoid"))

結果: 期待される状態は、単語ID列を入力し、二値分類の値を返すRNN構造が作られることです。

この構成では、Embeddingが単語IDをベクトルに変換し、SimpleRNNが順序を考慮して特徴をまとめます。文章分類の初心者向けサンプルコードとしては短いものの、長文や複雑な文脈には別の構造が向く場合があります。

model.compile(
    optimizer="rmsprop",
    loss="binary_crossentropy",
    metrics=["accuracy"]
)

# X_train と y_train はトークン化済みデータとして別途用意
# model.fit(X_train, y_train, epochs=10, batch_size=32)

結果: 期待される状態は、文章の二値分類に使う学習設定がモデルへ適用されることです。

この例でも、データの準備が結果を左右すると覚えるとよいでしょう。文章を数値列に変換するトークン化、系列長の統一、未知語の扱いを決めてからモデルへ渡すと、処理の流れが安定します。

注意点と対処法

Pythonと機械学習のプログラミングでは、コードが動くことと、妥当な予測ができることを分けて考える必要があります。初心者がつまずきやすいのは、エラーが出ないモデルを作れた時点で、評価やデータ品質の確認を省いてしまう点です。

そのため、データの品質、訓練データと評価データの分離、パラメータ調整、古いAPIの利用有無を確認すると考えられますし、これが一つの目安です。Pythonで改行や表示の細かな挙動に迷う場合は、Pythonで改行あり・なしを制御する方法も補助になります。

データの品質と量

機械学習はデータから規則性を学ぶため、欠損、外れ値、重複、偏りがあると結果に影響します。大量のデータがあっても、目的と関係の薄い値や誤記が多ければ、モデルは望ましい判断基準を学びにくくなると言えるでしょう。

具体的には、dropnaで欠損行を除く、条件式で明らかな異常値を除く、カテゴリの表記ゆれを直す、といった処理を組み合わせますが、覚えておくと役立つでしょう。ただし、削除しすぎると学習に使える情報も失うため、削除前後の件数を確認することが大切です。

df = df.dropna()
df = df[df["column_name"] != "outlier_value"]

print(len(df))

結果: 期待される出力は、欠損値と指定した外れ値を除いた後の行数です。

この処理は単純ですが、すべての欠損を削除する方針が常に適切とは限りません。数値列なら中央値で補完する、カテゴリ列なら欠損を一つのカテゴリとして扱うなど、目的に合わせた判断が必要になります。

パラメータのチューニング

多くのモデルには、学習前に決めるハイパーパラメータがあるのが基本です。たとえばSVMのCgamma、ランダムフォレストのn_estimators、K-meansのn_clustersなどです。

その値を手作業で変え続けると比較が曖昧になりやすいため、候補を決めて自動的に評価するGridSearchCVを使う方法があります。評価用データへの情報漏れを避けるため、交差検証の考え方も合わせて確認すると言えるでしょう。

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

param_grid = {
    "C": [0.1, 1, 10, 100],
    "gamma": [1, 0.1, 0.01, 0.001]
}

grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=2)
grid.fit(X_train, y_train)

print(grid.best_params_)

結果: 期待される出力は、候補の中で評価が高かったCgammaの組み合わせです。

この方法は候補をすべて試すため、候補数が多いと時間がかかります。探索範囲を広げすぎず、最初は少ない候補で傾向を見てから範囲を調整するのが扱いやすいでしょう。

過学習と評価データの扱い

過学習は、訓練データにはよく合うものの、未知データでは性能が落ちる状態です。複雑なモデル、少ないデータ、偏ったデータを組み合わせると起きやすくなります。

その対策として、訓練データと評価データを分け、必要に応じて交差検証を使いるのが目安です。モデルの改善では、訓練精度だけでなく評価精度や損失の変化を見て、学習が進みすぎていないか確認するのが基本です。

⚠️ 注意: 評価用データを前処理の学習に混ぜると、未知データの性能を正しく見積もれません。標準化や欠損補完も、訓練データで決めた処理を評価データへ適用する形にします。

古いコードを読むときの注意

Pythonと機械学習の周辺ライブラリは更新が続いているため、古いサンプルコードがそのまま動かない場合があるのがポイントです。たとえばpandasのDataFrame.appendは非推奨を経て削除されており、行を結合する場合はpd.concatを使うのが現行の書き方です。

同様に、scikit-learnのload_bostonも削除済みです。検索で見つけたコードを使うときは、公式ドキュメントのバージョン、警告表示、代替APIを確認してから学習環境へ取り込むと安全に進められます。

関連する自動化や周辺操作へ広げたい場合は、Pythonでウィンドウ操作を自動化する記事も参考になるのが目安です。機械学習そのものとは別領域ですが、Pythonで作業を自動化する感覚をつかむ助けになるでしょう。

まとめ

Pythonで機械学習を学ぶ流れは、文法を覚えるだけでなく、データを読み、整え、可視化し、モデルへ渡し、評価するところまでつなげて考えると理解しやすくなるのが一般的です。初心者向けのガイドとしては、短いサンプルコードを動かす前提で読み、各行がどのデータを扱っているのかを追う姿勢が役立ちます。

その中で、NumPyは配列、pandasは表、Matplotlibは可視化、scikit-learnはモデル作成を担います。役割を分けて整理できれば、分類、回帰、クラスタリング、ニューラルネットワークのサンプルコードも一つの流れとして読めるでしょう。

これから学習を進めるなら、まず小さなCSVを読み込み、集計とグラフ化を行い、単純な分類モデルで評価する流れを作るのが現実的です。プログラミングの基礎と機械学習の考え方を往復しながら、データ品質、評価、非推奨APIの確認まで含めて習慣化すると、応用へ進みやすくなるのが現実的です。

関連記事

著者: Japanシーモア編集部

Japanシーモアは、Web/IoT/APP/SYS 分野のプログラミング情報を体系的に提供するメディアです。本記事は編集部による執筆とAI支援を組み合わせて制作し、公開前に編集部が校正しています。誤りや改善案がございましたらお問い合わせよりご連絡ください。

※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。