STEP 6:Scikit-learnのインストールと基本API

🤖 STEP 6: Scikit-learnのインストールと基本API

Scikit-learnの環境構築と、統一されたAPIの使い方を学びます

📋 このステップで学ぶこと

  • 環境構築とインストール
  • Estimatorの概念
  • fit()、predict()、score()、transform()の役割
  • 一貫性のあるAPI設計
  • サンプルデータセット(Iris、Digits、Wine)
  • 基本的なワークフロー実装

練習問題: 8問

🎯 1. Scikit-learnとは?

Scikit-learn(サイキット・ラーン)は、Pythonで最も人気のある機械学習ライブラリです。シンプルで使いやすいAPIと、豊富なアルゴリズムが特徴で、機械学習を始めるなら必ず使うことになります。

✨ Scikit-learnの5つの特徴
  • シンプル:統一されたAPIで、どのアルゴリズムも同じように使える
  • 豊富:分類、回帰、クラスタリングなど、ほとんどのアルゴリズムに対応
  • 高速:内部でC言語やCythonを使用し、高速動作
  • 無料:オープンソース(BSDライセンス)
  • ドキュメントが充実:公式ドキュメントが非常に詳しい

📊 Scikit-learnで使えるアルゴリズム

【Scikit-learnで使えるアルゴリズム一覧】 ■ 分類(Classification): ・ロジスティック回帰 ・決定木、ランダムフォレスト ・SVM、k近傍法、ナイーブベイズ ・XGBoost、LightGBM(別途インストール) ■ 回帰(Regression): ・線形回帰、Ridge、Lasso ・決定木回帰、ランダムフォレスト回帰 ■ クラスタリング(Clustering): ・k-means、階層的クラスタリング ・DBSCAN ■ 次元削減(Dimensionality Reduction): ・PCA(主成分分析)、t-SNE ■ その他: ・異常検知、特徴量選択、パイプライン

💻 2. 環境構築とインストール

方法1:Google Colab(推奨)

🌟 最も簡単な方法

Google Colabを使えば、インストール不要ですぐに始められます!Scikit-learnは最初から入っています。

手順:

  1. https://colab.research.google.com/ にアクセス
  2. 「ノートブックを新規作成」をクリック
  3. すぐにコードが書ける!

方法2:ローカル環境(Anaconda または pip)

# Anaconda経由でインストール(推奨) conda install scikit-learn # または、pipでインストール pip install scikit-learn # 特定のバージョンをインストール pip install scikit-learn==1.3.0

✅ インストール確認

import sklearn # バージョン確認 print(sklearn.__version__) # 例: 1.3.0
💡 このコースでの推奨環境

このコースでは、Google Colabを使うことを強く推奨します。

理由:

  • 環境構築が不要(ブラウザだけでOK)
  • GPUが無料で使える
  • 必要なライブラリが最初から入っている
  • どこからでもアクセスできる
  • Googleアカウントがあれば無料で使える

🔧 3. Scikit-learnの基本API

📌 Estimator(推定器)の概念

Estimatorとは?

Scikit-learnでは、すべてのアルゴリズムがEstimator(推定器)と呼ばれるオブジェクトです。

どのアルゴリズムも、同じメソッド(fit、predict、scoreなど)で使えるように設計されています。これがScikit-learnの最大の特徴です。

🎯 基本的な使い方(3ステップ)

【Scikit-learnの基本ワークフロー】 1. モデルを作る(インスタンス化) model = LogisticRegression() 2. 学習させる(fit) model.fit(X_train, y_train) 3. 予測する(predict) y_pred = model.predict(X_test) ※ どのアルゴリズムも、この3ステップで使える!

📊 主要なメソッド

メソッド 説明
fit(X, y) 学習を行う
・X: 特徴量(2次元配列)
・y: 正解ラベル(1次元配列)
・モデルがデータからパターンを学習する
predict(X) 予測を行う
・X: 特徴量(2次元配列)
・戻り値: 予測結果(1次元配列)
・学習したパターンを使って予測
score(X, y) 評価を行う
・X: 特徴量(2次元配列)
・y: 正解ラベル(1次元配列)
・戻り値: 精度スコア(0〜1)
・分類:正解率、回帰:R²スコア
transform(X) 変換を行う
・主に前処理で使用
・例:スケーリング、次元削減
・戻り値: 変換後のデータ
fit_transform(X) 学習と変換を同時に行う
・fit() + transform()を一度に実行
・訓練データに対してのみ使用

⚠️ データの形状に注意

💡 Xは2次元配列、yは1次元配列

Scikit-learnでは、Xは2次元配列(サンプル数 × 特徴量数)yは1次元配列(サンプル数)である必要があります。

# 正しい形 X = [[1, 2], [3, 4], [5, 6]] # 2次元配列(3サンプル、2特徴量) y = [0, 1, 0] # 1次元配列(3サンプル) # 間違い X = [1, 2, 3] # 1次元配列 → エラー! # NumPyの場合 import numpy as np X = np.array([[1, 2], [3, 4], [5, 6]]) y = np.array([0, 1, 0]) print(X.shape) # → (3, 2) [サンプル数, 特徴量数] print(y.shape) # → (3,) [サンプル数]

📦 4. サンプルデータセットの使い方

Scikit-learnには、学習用のサンプルデータセットが組み込まれています。実際にデータを用意しなくても、すぐに練習できます。

① Iris(アヤメ)データセット

🌸 Irisデータセットとは?

最も有名な機械学習データセットです。3種類のアヤメの花について、4つの特徴量を測定したデータです。

  • サンプル数:150件
  • 特徴量:4つ(がく片の長さ・幅、花びらの長さ・幅)
  • クラス:3種類(Setosa、Versicolor、Virginica)
  • 用途:分類問題の練習
from sklearn.datasets import load_iris import pandas as pd # データ読み込み iris = load_iris() # データの確認 print(“特徴量の形状:”, iris.data.shape) # (150, 4) print(“クラス数:”, len(iris.target_names)) # 3 print(“クラス名:”, iris.target_names) # [‘setosa’ ‘versicolor’ ‘virginica’] print(“特徴量名:”, iris.feature_names) # DataFrameに変換(見やすい) df = pd.DataFrame(iris.data, columns=iris.feature_names) df[‘target’] = iris.target print(df.head())
特徴量の形状: (150, 4) クラス数: 3 クラス名: [‘setosa’ ‘versicolor’ ‘virginica’] 特徴量名: [‘sepal length (cm)’, ‘sepal width (cm)’, ‘petal length (cm)’, ‘petal width (cm)’] sepal length (cm) sepal width (cm) … petal width (cm) target 0 5.1 3.5 … 0.2 0 1 4.9 3.0 … 0.2 0 2 4.7 3.2 … 0.2 0 3 4.6 3.1 … 0.2 0 4 5.0 3.6 … 0.2 0

② Digits(手書き数字)データセット

🔢 Digitsデータセットとは?

手書き数字(0〜9)の画像データです。MNISTの簡易版として、画像分類の練習に最適です。

  • サンプル数:1,797件
  • 特徴量:64個(8×8ピクセルの画像を1次元化)
  • クラス:10種類(0〜9の数字)
  • 用途:画像分類の練習
from sklearn.datasets import load_digits import matplotlib.pyplot as plt # データ読み込み digits = load_digits() print(“画像数:”, digits.data.shape) # (1797, 64) print(“画像の形状:”, digits.images.shape) # (1797, 8, 8) print(“クラス数:”, len(digits.target_names)) # 10 # 最初の画像を表示 plt.figure(figsize=(4, 4)) plt.imshow(digits.images[0], cmap=’gray’) plt.title(f”Label: {digits.target[0]}”) plt.show()

③ Wine(ワイン)データセット

🍷 Wineデータセットとは?

ワインの化学成分から、ワインの種類を分類するデータです。

  • サンプル数:178件
  • 特徴量:13個(アルコール度数、マグネシウム量など)
  • クラス:3種類
  • 用途:分類問題の練習
from sklearn.datasets import load_wine # データ読み込み wine = load_wine() print(“サンプル数:”, wine.data.shape) # (178, 13) print(“特徴量名:”, wine.feature_names)

📋 その他の組み込みデータセット

【その他の組み込みデータセット】 ■ 回帰用: load_diabetes() – 糖尿病(442件、10特徴量) fetch_california_housing() – カリフォルニア住宅価格 ■ 分類用: load_breast_cancer() – 乳がん診断(569件、30特徴量) ■ 人工データ生成: make_classification() – 人工的な分類データ make_regression() – 人工的な回帰データ make_blobs() – クラスタリング用データ

🚀 5. 基本的なワークフロー実装

完全なコード例(分類)

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 # 1. データ読み込み iris = load_iris() X = iris.data # 特徴量 y = iris.target # ラベル print(f”全データ数: {len(X)}件”) # 2. データ分割(訓練70%、テスト30%) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42, stratify=y ) print(f”訓練データ数: {len(X_train)}件”) print(f”テストデータ数: {len(X_test)}件”) # 3. モデル作成 model = LogisticRegression(max_iter=200) # 4. 学習 model.fit(X_train, y_train) # 5. 予測 y_pred = model.predict(X_test) # 6. 評価 accuracy = accuracy_score(y_test, y_pred) print(f”\n正解率: {accuracy:.2%}”) # または、scoreメソッドを使う score = model.score(X_test, y_test) print(f”スコア: {score:.2%}”)
全データ数: 150件 訓練データ数: 105件 テストデータ数: 45件 正解率: 97.78% スコア: 97.78%

完全なコード例(回帰)

from sklearn.datasets import load_diabetes from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 1. データ読み込み diabetes = load_diabetes() X = diabetes.data y = diabetes.target print(f”全データ数: {len(X)}件”) # 2. データ分割 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42 ) # 3. モデル作成 model = LinearRegression() # 4. 学習 model.fit(X_train, y_train) # 5. 予測 y_pred = model.predict(X_test) # 6. 評価 mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) print(f”\nMSE(平均二乗誤差): {mse:.2f}”) print(f”R²(決定係数): {r2:.2f}”) # または、scoreメソッドを使う(R²が返る) score = model.score(X_test, y_test) print(f”R²スコア: {score:.2f}”)
全データ数: 442件 MSE(平均二乗誤差): 2900.17 R²(決定係数): 0.45 R²スコア: 0.45

🎨 6. 一貫性のあるAPI設計

どのアルゴリズムも同じ使い方

Scikit-learnの最大の特徴は、どのアルゴリズムも同じ方法で使えることです。アルゴリズムを変えるのは1行だけ!

# ===== ロジスティック回帰 ===== from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test) # ===== ランダムフォレスト ===== from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier() model.fit(X_train, y_train) # 同じ! y_pred = model.predict(X_test) # 同じ! # ===== SVM ===== from sklearn.svm import SVC model = SVC() model.fit(X_train, y_train) # 同じ! y_pred = model.predict(X_test) # 同じ! # ===== k近傍法 ===== from sklearn.neighbors import KNeighborsClassifier model = KNeighborsClassifier() model.fit(X_train, y_train) # 同じ! y_pred = model.predict(X_test) # 同じ! # → アルゴリズムを変えるのは1行だけ!
💡 Scikit-learnの設計哲学
  • 一貫性(Consistency):すべてのオブジェクトが同じインターフェース
  • 検査可能(Inspection):学習したパラメータにアクセスできる
  • デフォルト設定:ほとんどの場合、デフォルトで十分動作する
  • 組み合わせ可能(Composition):パイプラインで組み合わせられる

この設計のおかげで、一度使い方を覚えれば、どのアルゴリズムも同じように使えます。

🔍 7. よくあるエラーと対処法

エラー1:データの形状が間違っている

❌ エラーメッセージ

ValueError: Expected 2D array, got 1D array instead

原因:Xが1次元配列になっている
解決策:2次元配列に変換する

import numpy as np # 間違い X = [1, 2, 3, 4, 5] model.fit(X, y) # エラー! # 正しい方法1:2次元リストにする X = [[1], [2], [3], [4], [5]] model.fit(X, y) # OK # 正しい方法2:NumPyでreshapeする X = np.array([1, 2, 3, 4, 5]) X = X.reshape(-1, 1) # (-1, 1)で自動的に2次元化 model.fit(X, y) # OK

エラー2:fit()せずにpredict()

❌ エラーメッセージ

NotFittedError: This model is not fitted yet.

原因:学習(fit)する前に予測(predict)している
解決策:必ずfit()してからpredict()

# 間違い model = LogisticRegression() y_pred = model.predict(X_test) # エラー! # 正しい model = LogisticRegression() model.fit(X_train, y_train) # まず学習 y_pred = model.predict(X_test) # その後予測

エラー3:特徴量の数が違う

❌ エラーメッセージ

ValueError: X has 3 features, but model is expecting 4 features

原因:訓練時とテスト時で特徴量の数が違う
解決策:同じ特徴量を使う

# 間違い X_train = [[1, 2, 3, 4]] # 4つの特徴量 model.fit(X_train, y_train) X_test = [[1, 2, 3]] # 3つの特徴量 y_pred = model.predict(X_test) # エラー! # 正しい X_test = [[1, 2, 3, 4]] # 4つの特徴量(訓練時と同じ) y_pred = model.predict(X_test) # OK

📝 STEP 6 のまとめ

✅ このステップで学んだこと
  • Scikit-learnは、Pythonで最も人気の機械学習ライブラリ
  • Google Colabなら環境構築不要ですぐに始められる
  • 基本的な使い方は「作る → 学習 → 予測」の3ステップ
  • fit()、predict()、score()が主要なメソッド
  • Xは2次元配列、yは1次元配列にする必要がある
  • Iris、Digits、Wineなど、組み込みデータセットで練習できる
  • どのアルゴリズムも同じ方法で使える(一貫性のあるAPI)
💡 最重要ポイント

Scikit-learnの最大の特徴は、一貫性のあるAPIです。一度使い方を覚えれば、どのアルゴリズムも同じように使えます。

これから学ぶすべてのアルゴリズムが、fit() → predict()の流れで動作します。

🔜 次のステップへ

STEP 7では、「機械学習の可視化」について学びます。決定境界、学習曲線、混同行列などを視覚的に理解していきましょう。

📝 練習問題

問題1 やさしい

Scikit-learnの基本

Scikit-learnでモデルを使う際の正しい順序を選んでください。

  • A. predict() → fit() → モデル作成
  • B. モデル作成 → predict() → fit()
  • C. モデル作成 → fit() → predict()
  • D. fit() → モデル作成 → predict()
正解:C

なぜCが正解なのか?

正しい順序は「モデル作成 → fit() → predict()」です。

# 1. モデル作成(インスタンス化) model = LogisticRegression() # 2. 学習(fit) model.fit(X_train, y_train) # 3. 予測(predict) y_pred = model.predict(X_test)

各ステップの意味:

  • モデル作成:アルゴリズムを選んで、モデルの「箱」を作る
  • fit():データを使って、モデルに「中身」(パターン)を学習させる
  • predict():学習したパターンを使って、新しいデータの予測をする

他の選択肢が間違いの理由:

A, B, D:fit()する前にpredict()することはできません。まだ何も学習していないモデルは予測ができません。「勉強していないのにテストを受ける」ようなものです。fit()せずにpredict()すると「NotFittedError」が発生します。

問題2 やさしい

データの形状

Scikit-learnのfit()メソッドに渡すデータの正しい形を選んでください。

  • A. X: 1次元配列、y: 1次元配列
  • B. X: 2次元配列、y: 1次元配列
  • C. X: 1次元配列、y: 2次元配列
  • D. X: 2次元配列、y: 2次元配列
正解:B

なぜBが正解なのか?

Scikit-learnでは、Xは2次元配列yは1次元配列である必要があります。

# 正しい例 X = [[1, 2], [3, 4], [5, 6]] # 2次元(3サンプル、2特徴量) y = [0, 1, 0] # 1次元(3サンプル) # NumPyの場合 import numpy as np X = np.array([[1, 2], [3, 4], [5, 6]]) y = np.array([0, 1, 0]) print(X.shape) # → (3, 2) [サンプル数, 特徴量数] print(y.shape) # → (3,) [サンプル数]

なぜこの形が必要なのか:

  • X(特徴量):「サンプル × 特徴量」の表形式データ。各行が1つのサンプル、各列が1つの特徴量を表す
  • y(ラベル):各サンプルに対応する1つの正解値。サンプル数だけの1次元配列

他の選択肢が間違いの理由:

A(X: 1次元):Xが1次元だと、複数の特徴量を扱えません。Scikit-learnは「ValueError: Expected 2D array, got 1D array instead」というエラーを出します。

C, D(y: 2次元):通常の分類・回帰では、yは1次元配列です。2次元にする必要はありません(マルチラベル分類など特殊なケースを除く)。

問題3 やさしい

メソッドの役割

次のうち、学習を行うメソッドはどれですか?

  • A. predict()
  • B. fit()
  • C. score()
  • D. transform()
正解:B

なぜBが正解なのか?

fit()が学習を行うメソッドです。「fit」は「適合させる」という意味で、モデルをデータに適合させる(学習させる)ことを表します。

各メソッドの役割:

  • fit():データからパターンを学習する(重み、パラメータを決定)
  • predict():学習したパターンを使って予測する
  • score():予測精度を評価する(分類:正解率、回帰:R²)
  • transform():データを変換する(前処理で使用、例:スケーリング)

覚え方:

fit(フィット)= 「フィットさせる」= 「データに合わせて学習する」と覚えましょう。

問題4 ふつう

組み込みデータセット

次のうち、画像分類の練習に最も適した組み込みデータセットはどれですか?

  • A. load_iris()
  • B. load_digits()
  • C. load_wine()
  • D. load_diabetes()
正解:B

なぜBが正解なのか?

load_digits()は手書き数字の画像データ(8×8ピクセル)を含むため、画像分類の練習に最適です。

各データセットの特徴:

  • load_digits():手書き数字の画像データ(8×8ピクセル、64特徴量)→ 画像分類
  • load_iris():アヤメの花の計測データ(4特徴量)→ 表形式データの分類
  • load_wine():ワインの化学成分データ(13特徴量)→ 表形式データの分類
  • load_diabetes():糖尿病の進行度データ(10特徴量)→ 回帰

Digitsデータセットの詳細:

  • サンプル数:1,797件
  • 各画像は8×8ピクセル = 64個の数値(グレースケール)
  • クラス:0〜9の10種類の数字
  • MNISTの簡易版として、画像分類の入門に最適
問題5 ふつう

エラーの原因

次のコードを実行すると、エラーが発生します。原因は何ですか?

from sklearn.linear_model import LogisticRegression model = LogisticRegression() y_pred = model.predict([[1, 2, 3, 4]])
  • A. LogisticRegressionの使い方が間違っている
  • B. fit()を呼び出していない
  • C. データの形状が間違っている
  • D. predictの引数が間違っている
正解:B

なぜBが正解なのか?

fit()を呼び出さずにpredict()を実行しているため、エラーが発生します。

エラーメッセージ:NotFittedError: This model is not fitted yet.

# 間違い(エラーが発生) model = LogisticRegression() y_pred = model.predict([[1, 2, 3, 4]]) # NotFittedError! # 正しい model = LogisticRegression() model.fit(X_train, y_train) # まず学習 y_pred = model.predict([[1, 2, 3, 4]]) # その後予測

なぜfit()が必要なのか:

モデルは、fit()で訓練データからパターンを学習します。学習していないモデルは、どう予測すればいいかわかりません。「勉強していないのにテストを受ける」ようなものです。

他の選択肢が間違いの理由:

A(使い方が間違い):LogisticRegression()の作成方法は正しいです。
C(データの形状):[[1, 2, 3, 4]]は2次元配列なので、形状は正しいです。
D(引数が間違い):predict()に2次元配列を渡すのは正しいです。

問題6 ふつう

score()メソッドの戻り値

分類モデルでscore()メソッドを呼び出すと、何が返ってきますか?

  • A. 損失関数の値
  • B. 正解率(Accuracy)
  • C. 予測結果
  • D. 学習したパラメータ
正解:B

なぜBが正解なのか?

分類モデルのscore()は、正解率(Accuracy)を返します。0〜1の値で、1に近いほど精度が高いことを意味します。

from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) # score()は正解率を返す accuracy = model.score(X_test, y_test) print(accuracy) # 例: 0.95 (95%の正解率)

分類と回帰の違い:

  • 分類モデル:score()は正解率(Accuracy)を返す
  • 回帰モデル:score()はR²スコア(決定係数)を返す

他の選択肢が間違いの理由:

A(損失関数の値):損失関数の値を取得するには別のメソッドが必要です。
C(予測結果):予測結果はpredict()で取得します。
D(学習したパラメータ):パラメータはmodel.coef_やmodel.intercept_などの属性でアクセスします。

問題7 むずかしい

アルゴリズムの切り替え

次のコードで、ロジスティック回帰からランダムフォレストに変更したいです。
最小限の変更で実現するには、どこを変えればよいですか?

from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier model = LogisticRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test) accuracy = model.score(X_test, y_test)
  • A. 1行だけ変更すればよい
  • B. 2行変更する必要がある
  • C. 3行変更する必要がある
  • D. すべて書き直す必要がある
正解:A

なぜAが正解なのか?

Scikit-learnの一貫性のあるAPIのおかげで、1行だけ変更すればOKです。

from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier # この1行だけ変更! # model = LogisticRegression() ← 変更前 model = RandomForestClassifier() # ← 変更後 # 以下は全く同じ! model.fit(X_train, y_train) y_pred = model.predict(X_test) accuracy = model.score(X_test, y_test)

これがScikit-learnの素晴らしいところ!

どのアルゴリズムも、fit() → predict() → score()という同じインターフェースで使えるため、アルゴリズムを変更するのはモデル作成の1行だけで済みます。

この設計のおかげで、様々なアルゴリズムを簡単に試すことができます。

問題8 むずかしい

transform()の使い方

StandardScaler(標準化)を使う場合、正しいコードはどれですか?

  • A. scaler.fit(X_train)
    X_train_scaled = scaler.transform(X_train)
    X_test_scaled = scaler.transform(X_test)
  • B. scaler.fit(X_train)
    X_train_scaled = scaler.transform(X_train)
    X_test_scaled = scaler.fit(X_test).transform(X_test)
  • C. X_train_scaled = scaler.fit_transform(X_train)
    X_test_scaled = scaler.fit_transform(X_test)
  • D. scaler.fit(X_train + X_test)
    X_train_scaled = scaler.transform(X_train)
    X_test_scaled = scaler.transform(X_test)
正解:A

なぜAが正解なのか?

標準化などの前処理では、訓練データでfit()、テストデータではtransform()のみが正しいです。

from sklearn.preprocessing import StandardScaler scaler = StandardScaler() # 正しい方法 # 1. 訓練データでfit()(平均と標準偏差を学習) scaler.fit(X_train) # 2. 訓練データをtransform() X_train_scaled = scaler.transform(X_train) # 3. テストデータはtransform()のみ(fit()しない!) X_test_scaled = scaler.transform(X_test)

補足:fit_transform()を使う場合

# 訓練データはfit_transform()で一度に処理できる X_train_scaled = scaler.fit_transform(X_train) # テストデータはtransform()のみ X_test_scaled = scaler.transform(X_test)

他の選択肢が間違いの理由:

B が間違いの理由:
テストデータでfit()してはいけません。これを「データリーケージ(Data Leakage)」と呼び、テストデータの情報がモデルに漏れてしまいます。

C が間違いの理由:
テストデータでfit_transform()すると、テストデータ独自の平均・標準偏差で標準化されてしまいます。訓練データとテストデータで異なる基準で標準化されるため、正しく比較できません。

D が間違いの理由:
訓練とテストを一緒にfit()すると、テストデータの情報が訓練に漏れてしまいます(データリーケージ)。

重要な原則:

前処理は「訓練データで学習した統計量(平均、標準偏差など)」を使って、テストデータも変換する必要があります。テストデータの情報を訓練に使ってはいけません。

📝

学習メモ

機械学習入門 - Step 6

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE