機械学習 (11): Scikit-learn ライブラリの基本と使用法

全文は15,000語以上、読了時間の目安は約30~50分 | 役立つ情報が満載ですので、保存することをお勧めします!

ここに画像の説明を挿入します

この記事に関係するコードのダウンロード アドレス

1. はじめに

1.1 Scikit-learnの開発経緯と定義

Scikit-learn の開発は 2007 年に始まり、Google Summer of Code プロジェクトの一環として David Cournapeau によって開始されました。このプロジェクトはその後、INRIA (フランス国立情報自動化研究所)、ワイカト大学、その他の機関を含む多くの開発者からの貢献を受けました。

このプロジェクトは、アルゴリズム ライブラリが SciPy に基づいて構築されているため、Scikit-Learn と名付けられています。Scikit は、SciPy Kit (SciPy から派生したツール スイート) の略称です。

Scikit-learn は、現在、機械学習の分野で最も完全で最も影響力のあるアルゴリズム ライブラリです。これは Numpy、Scipy、matplotlib に基づいており、分類、回帰、クラスタリング、次元削減などを含む多数の機械学習アルゴリズムの実装が含まれています。また、モデルの評価と選択のための多くのメソッドも含まれています。Scikit-learn の API は、非常に明確で使いやすく、理解しやすいように設計されており、初心者が使い始めるのに適しており、実際的な問題を解決する専門家のニーズも満たします。

1.2 アルゴリズム パッケージ、アルゴリズム ライブラリ、アルゴリズム フレームワーク間の違いと関連性を理解する

アルゴリズム パッケージ: 特定の問題または一連の関連問題に対する、事前に作成されたアルゴリズム実装が含まれています。アルゴリズム パッケージを使用して、数値分析、機械学習、画像処理などの特定のタスクや操作を実行できます。ユーザーは、これらのアルゴリズムを最初から作成しなくても、直接呼び出すことができます。表形式データ分析パッケージ Pandasなど

アルゴリズム ライブラリ: アルゴリズム ライブラリとアルゴリズム パッケージは非常に似ており、多くの場合同じ意味で使用されます。また、特定の問題を解決するために使用される、事前に作成されたアルゴリズムのコレクションも含まれています。主に、より高度なカプセル化、機械学習アルゴリズム関数のより完全な実装、およびある種のデータ構造の定義を備えたアルゴリズムを指します。コード モジュール、科学技術計算ライブラリNumPyなど

アルゴリズム フレームワーク: アルゴリズム フレームワークは、アルゴリズムを開発、構築、実装するためのシステムを提供するより大きな概念であり、通常は標準プログラミング インターフェイス (API)、ツール、ライブラリ、仕様のセットが含まれます。その主な目的は、開発プロセスを簡素化および標準化し、開発者がインフラストラクチャに関する多くの問題に対処することなく、特定の機能やアルゴリズムの実装に集中できるようにすることです。機械学習アルゴリズムライブラリScikit-Learnなど

これを簡単に理解するには、レストランの比喩を使用して、次の 3 つの概念を理解してください。

  • アルゴリズム パッケージ: レストランのメニューの特定の料理のようなもの。それぞれの料理には特定の調理法があり、さまざまな食材を特定の方法で組み合わせて特定の料理が作成されます。たとえば、魚風味の豚細切りが食べたい場合、シェフに作り方を告げずに直接注文することもできます。
  • アルゴリズム ライブラリ: レストランのメニュー全体のようなもの。メニューには多くの料理が含まれており、メインコース、スープ、デザートが必要かどうかをメニューで見つけることができます。作り方を知らなくても、メニューから食べたいものを選ぶだけです。
  • アルゴリズム フレームワーク: レストラン全体の運営モデルと同じです。これにはメニューだけでなく、レストランの装飾スタイル、ウェイターのサービス態度、料理の調理方法、料理の提供時間などが含まれます。食事そのものだけでなく、完全な食事体験を 1 か所で楽しめる便利な方法を提供します。

したがって、プログラミングでは、アルゴリズム パッケージを直接使用して特定の問題を解決し、アルゴリズム ライブラリを使用して一連の問題を解決し、アルゴリズム フレームワークを使用してコードをより適切に整理および構築し、より効果的に問題を解決します。

2.Scikit-learn公式サイトの構成

ほとんどの人気のあるオープンソース プロジェクトの場合、公式 Web サイトは学習に最適なリソースです。これは特に Scikit-Learn に当てはまります。一流のオープンソース プロジェクトが普及している現在でも、Scikit-Learn 公式 Web サイトは、関連コンテンツの詳細かつ完全な紹介という点で業界で誰にも負けません。Scikit-Learn のインストールとアップデート、特定のアルゴリズムの使用、さらにはアルゴリズムの核となる原理やアルゴリズムの使用例に関する論文のソースについても、Scikit-Learn 公式 Web サイトに詳細な紹介があります。公式ウェブサイトのアドレス:

Scikit-Learn公式サイト では、主な機能が以下のように紹介されています。

画像-20230703105257138

  1. ナビゲーションバー

画像-20230703103736820

  1. 6つの機能モジュール

Scikit-learn は、すべての評価器と関数を 6 つのカテゴリ、つまり分類モデル (Classification)、回帰モデル (Regression)、クラスタリング モデル (Clustering)、次元削減方法 (Dimensionalityduction)、モデル選択 (Modelselection)、およびデータ前処理に分類します。

実際には 6 つの機能モジュールの分割には重複する部分が多くあり、多くのモデルでは分類問題と回帰問題の両方を処理でき、多くのクラスタリング アルゴリズムは次元削減手法としても使用できます。例えば、線形回帰評価器はモデル評価指標を利用し、回帰から検索することができますが、最終的には評価指標がモデル選択の指針となりますので、モデル評価指標を算出するための効用関数の検索はモデル選択入口から入力してください。 。

画像-20230703104323919

  1. ユーザーガイド: すべての sklearn コンテンツのドキュメントのコレクション

上部の「ユーザーガイド」列に、すべての sklearn コンテンツのコレクション ページが表示されます。このページには、使用順にソートされたすべての sklearn コンテンツが含まれています。左上の「その他のバージョン」をクリックすると、sklearn のすべてのバージョンのユーザーガイドの PDF バージョンをダウンロードできます。

画像-20230703105941226

  1. API: 第 2 レベルのモジュールによってアルファベット順にソートされたインターフェイスに従ってドキュメントをクエリします。

エバリュエーターまたはユーティリティ関数の名前に基づいて関連する API ドキュメントを検索したい場合は、上部の API 列をクリックして、ダイオード モジュールの最初の文字でソートされた API クエリ ドキュメントを入力できます。第 2 レベルのモジュールは、線形回帰を含む Linear_model モジュール、または MSE を含むメトリクス モジュールを指します。

画像-20230703110042249

3. インストールと設定

3.1 Python環境のインストールと設定

Python の基本環境のインストール方法がまだわからない場合は、Anaconda のダウンロード、インストール、起動、Jupyter の基本操作、強力な Notebook 編集環境について詳しく説明したこの記事を読むことをお勧めします。 PythonのバージョンアップやPythonの保守・管理を簡単に行うための手順として、サードパーティ製のライブラリなど役立つ情報が満載です!

Python パッケージをインストールおよびデプロイするいくつかの方法 | 役立つ情報が満載

3.2 Scikit-learnのインストール

Python 環境のインストールと設定が完了したら、Scikit-learn をインストールします (公式 Web サイト上の対応する場所は次のとおりです)。

画像-20230703110330682

Scikit-learn には Python (>= 3.6) と pip が必要です。

NumPy や SciPy などの Scikit-learn の依存関係パッケージをインストールします。これらのパッケージがすでにインストールされている場合は、この手順をスキップできます。まだお持ちでない場合は、次のコマンドを使用してインストールできます。

pip install numpy scipy

次に、Scikit-learn をインストールします。次のコマンドを使用してインストールします。

pip install -U scikit-learn

このコマンドは、Scikit-learn をインストールまたは最新バージョンにアップグレードします。

Anaconda を使用している場合は、次のコマンドを使用するだけで Scikit-learn をインストールするのが簡単です。

conda install scikit-learn

Scikit-learn が正常にインストールされたかどうかを確認するには、Python 環境にインポートしてみてください。

import sklearn
sklearn.__version__

エラー メッセージが表示されなければ、Scikit-learn は正常にインストールされています。

上記は基本的なインストール手順ですが、オペレーティング システムや Python 環境が異なると、一部異なる場合があります。実際の状況に応じて調整する必要があります。インストールプロセス中に問題が発生した場合は、Scikit-learn の公式ドキュメントを参照するか、オンラインで解決策を検索してください。

新しいバージョンの更新:

pip install --upgrade sklearn

4. Scikit-learn によるクイックスタート

4.1 データセットのインポートと処理

Scikit-learn は、多くの組み込みデータ セットを提供し、データ セットを作成するためのいくつかのメソッドも提供します。これらのデータ セットは、さまざまな機械学習アルゴリズムの使用をデモンストレーションするためによく使用されます。これらのデータ セットは、小規模なおもちゃのデータ セット (Toy データセット) と大規模な現実世界のデータ セット (Real-World データセット) の 2 つのタイプに分類されます。

一般的なおもちゃのデータ セットをいくつか示します。

  1. アヤメ: 3 種類のアヤメの花の 4 つの特徴を含む分類問題用のデータ セット。目的は、これらの特徴に基づいてアヤメの花の種類を予測することです。
  2. Digits (Handwriting Digits) : 手書き数字の 8x8 ピクセル画像を含む多分類問題用のデータ セット。目的は、これらの画像に対応する数字を識別することです。
  3. ボストン住宅価格: これは、ボストンのさまざまなエリアの住宅価格とその他 13 の特徴を含む回帰問題用のデータ セットです。目標は、住宅価格を予測することです。
  4. 乳がん: これは、乳房腫瘍の 30 個の特徴を含む二項分類問題用のデータ セットで、目的は腫瘍が良性か悪性かを予測することです。

sklearn のデータセット関連関数はすべて datasets モジュールの下にあり、API ドキュメントの datasets モジュールに含まれるコンテンツを通じて、すべてのデータセットとデータセットの作成方法の概要を取得できます。

画像-20230703140835097

画像-20230703141003085

画像-20230703141104936

sklearn.datasetsこれらのデータセットを Scikit-learn にロードするには、モジュール内の関連関数を使用できます。たとえば、次のとおりです。

from sklearn.datasets import load_iris

iris = load_iris()

この関数は、Bunchデータ、ターゲット、およびその他の情報を含むオブジェクトを返します。たとえば、iris.dataこれはフィーチャを含む 2 次元配列であり、iris.targetターゲットを含む 1 次元配列です。

名前 説明する
データ データセットの特徴マトリックス
目標 データセットラベル配列
機能名 列名
ターゲット名 各カテゴリの名前
フレーム 生成されたオブジェクトが DataFrame の場合、完全な DataFrame を返します。

対応するコードは、次のコードを使用して表示できます。

# 数据集包含四个特征
print("Features: ", iris.feature_names)
# 数据集有三种分类标签
print("Labels: ", iris.target_names)

# 将数据转换为DataFrame以便于查看
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)

# 添加分类标签到DataFrame
iris_df['label'] = iris.target

# 显示数据的前五行
print(iris_df.head())

画像-20230703141719555

Scikit-learn はいくつかの実世界のデータセットも提供しますが、サイズが大きいため、通常はダウンロードが必要です。これらのデータセットは、より複雑なタスクやアルゴリズムのテストに使用できます。たとえば、fetch_20newsgroupsこの関数は、テキスト分類などのタスクのために 20 のニュースグループのテキスト データセットをダウンロードできます。

4.2 データセットのセグメント化

Scikit-learn では、通常、元のデータ セットがトレーニング セットとテスト セットに分割されるため、目に見えないデータに対するモデルのパフォーマンスを評価できます。データ セット セグメンテーションの目的は、モデルのパフォーマンスをより適切に評価することです。モデルのパフォーマンスをより適切に評価するには、モデルをより適切に選択する必要があります。Scikit-learn は、このタスクを完了するのに役立つ関数を提供します。train_test_split は、モジュールの model_selection にありますtrain_test_split

画像-20230703142713957

画像-20230703142909817

次のように呼び出して使用できます。

from sklearn.model_selection import train_test_split

# 假设X是特征,y是目标
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

train_test_split関数の主なパラメータは次のとおりです。

  • X, y: 分割する必要があるデータ。
  • test_size: テストセットの割合を表します。上の例では、データの 20% をテスト セットとして使用します。
  • random_state: コードが実行されるたびにデータが同じ方法で分割されるようにするランダム シード。

コード内で、?メソッドを使用して関数の詳細を表示できます。

# 查阅该函数的帮助文档
train_test_split?

画像-20230703143118481

ここには注意が必要なパラメータが 2 つあります

  • 乱数シードの設定とrandom_stateの値が異なるため、セグメンテーションの結果も異なります。
  • stratifyパラメータは、トレーニング セットとテスト セット内の異なるカテゴリのサンプルの割合を制御するパラメータです。分割されたトレーニング セットとテスト セットの 0 と 1 の割合を元のデータと同じ (1:1) にしたい場合は、 、stratify= y を追加できます。

4.3 数値データの標準化

Scikit-learn の前処理モジュールは、sklearn.preprocessingデータ正規化 (Normalization) や標準化 (Standardization) など、多くの実用的な機能スケーリング関数を提供します。どちらの手法も、機械学習モデルをトレーニングするときに、特徴量が同じ範囲内に収まるように特徴量のスケールを変更するために使用されます。

ここで注意すべき点が 1 つあります。機能の観点から見ると、Scikit-learn の正規化は、実際には標準化と正規化の 2 つのカテゴリに分類されます。Z スコアの標準化と 0-1 の標準化はどちらも標準化のカテゴリに属しており、正規化とは、特に、そのノルムを使用して 1 つのサンプル (データの行) をスケーリングするプロセスを指します。

  1. データの正規化: 正規化とは通常、データを [0, 1] の範囲にスケーリングするか、すべてのデータの範囲を [-1, 1] にすることを意味します。これは Scikit-learn を使用して実現できますMinMaxScaler

    from sklearn.preprocessing import MinMaxScaler
    
    X = np.arange(30).reshape(5, 6)
    
    X_train, X_test = train_test_split(X)
    
    scaler = MinMaxScaler()
    X_train_normalized = scaler.fit_transform(X_train)
    X_test_normalized = scaler.transform(X_test)
    
    X_test_normalized
    

このコードは、最初にMinMaxScalerオブジェクトを作成し、次にfit_transformメソッドを使用してトレーニング データを適合および変換し、最後にtransformメソッドを使用してテスト データを変換します。

  1. データの標準化: 標準化とは、平均が 0、標準偏差が 1 になるようにデータをスケーリングすることです。これは Scikit-learn を通じて実現できますStandardScaler
X = np.arange(30).reshape(5, 6)

X_train, X_test = train_test_split(X)

scaler = StandardScaler()

X_train_standardized = scaler.fit_transform(X_train)

# 利用训练集的均值和方差对测试集进行标准化处理
X_test_standardized = scaler.transform(X_test)

X_test_standardized

説明する必要がある 1 つの点: なぜそれをトレーニング セットに使用しfit_transform、テスト レベルだけに使用する必要があるのですかtransform? **

これは、機械学習では、トレーニング セットとテスト セットを別々に処理する必要があるためです。具体的には、モデルはトレーニング セットでトレーニングする必要があり、テスト セットは、モデルの真のパフォーマンスを評価するためにモデルが見たことのない現実世界のデータをシミュレートする必要があります。したがって、あらゆる形式の前処理 (特徴スケーリングを含む) はトレーニング セット データに基づいてのみ実行する必要があります。

このメソッドがトレーニング セットに対して呼び出されるとfit_transformfitメソッドはトレーニング セット データの平均と標準偏差を計算し、transformこれらの計算されたパラメーター (平均と標準偏差) を使用してトレーニング セットを正規化します。

次に、テスト セットでメソッドが呼び出されるときtransform、Scikit-learn は、正規化のためにトレーニング セットで以前に計算された平均と標準偏差を使用します。その理由は、テスト セットはモデルがこれまでに見たことのない新しいデータであると想定されているため、テスト セット データに関する情報 (平均と標準偏差を含む) を使用してモデルに影響を与えることはできないためです。言い換えれば、テスト セット データは前処理段階では表示されないと想定する必要があります。

一般に、データを前処理するときは、前処理段階でテスト セットの情報が「漏洩」しないように、トレーニング セットfit_transformではメソッドを使用し、テスト セットではメソッドのみを使用する必要があります。transform

4.4 数値データの正規化

Scikit-learn では、preprocessing.normalize別のタイプの「正規化」。

preprocessing.normalizeこの機能は、各固有ベクトルのユークリッド長 (L2 ノルム) が 1 に等しくなる、または各要素の絶対値の合計 (L1 ノルム) が 1 に等しくなるように、ベクトル空間モデルに従って固有ベクトルを変換することです。言い換えると、標準化とは異なり、Scikit-learn での正規化は、単一のサンプル (データの行) を単位ノルム (1 ノルムまたは 2 ノルムが単位ノルム) にスケーリングするプロセスを指します。この操作は、カーネル法、またはサンプル間の類似性を測定するプロセス。

ベクトルx = [ x 1 , x 2 , . . , xn ] T x = [x_1, x_2, ..., x_n]^T と仮定します。バツ=[ ×1バツ2... バツ]Tの場合、ベクトル x の 1 ノルムの基本計算式は次のようになります:
∣ ∣ x ∣ ∣ 1 = ∣ x 1 ∣ + ∣ x 2 ∣ + . . . + ∣ xn ∣ (1) ||x|| _1 = |x_1|+|x_2|+...+|x_n| \tag{1}∣∣ × 1=x1+x2+...+x( 1 )
数学では、ノルム (Norm) はベクトルを非負の値にマッピングする関数です。直観的には、ノルムはベクトルの「長さ」または「サイズ」として理解できます。

つまり、各成分の絶対値の合計です。ベクトル x の 2 ノルムの計算式は次のとおりです。

∣ ∣ x ∣ ∣ 2 = ( ∣ x 1 ∣ 2 + ∣ x 2 ∣ 2 + . . . + ∣ xn ∣ 2 ) (2) ||x||_2=\sqrt{(|x_1|^2+| x_2|^2+...+|x_n|^2)} \tag{2}∣∣ × 2=( x12+x22+...+x2 ) ( 2 )

つまり、各成分の二乗和が二乗されます。

Scikit-learn の正規化プロセスは、実際にはデータの各行をベクトルとして扱い、データの各行を使用してデータの行の 1 ノルムまたは 2 ノルムを分割します。除算する特定のノルムは、preprocessing.normalize 関数に入力されたノルム パラメーターに基づきます。

from sklearn.preprocessing import normalize
import numpy as np

# 创建一个numpy数组
X = np.array([[1., -1., 2.],
              [2., 0., 0.],
              [0., 1., -1.]])

# 对数据进行归一化处理,使用默认的L2范数
X_normalized = normalize(X, norm='l2')

上記のコードでは、各行の特徴ベクトルが単位ノルム (長さ 1) に正規化されています。これは、各サンプルのすべての固有値の二乗和が 1 であることを意味します。normパラメーターを「l1」に設定して、各サンプルのすべての固有値の絶対値合計が 1 になるように、L1 ノルム正規化を実行することもできます

4.4 コアオブジェクトタイプ: 推定器

多くの強力なサードパーティ ライブラリは、独自のコア オブジェクト タイプを定義しています。これらのオブジェクト タイプは、実際にはソース コードで定義されている特定のクラスのインスタンスです。たとえば、NumPy のコアは配列 (Array)、Pandas のコアは DataFrame、PyTorch のコアはテンソル (Tensor) です。これらのオブジェクト タイプは、データ分析と機械学習のための強力なツールを提供します。

Scikit-learn の場合、その中心となるオブジェクト タイプは推定器です。エバリュエーターは、さまざまな機械学習モデルをカプセル化するツールと考えてください。Scikit-learn のモデル トレーニング プロセスの中核は、これらの評価者を中心に展開します。

一般に、これらのさまざまなライブラリのコア オブジェクト タイプは、特定のタスクを処理するための利便性を提供し、複雑な詳細を処理するために最下層に深く入る必要がなく、問題の解決により集中できるようになります。

エバリュエーターの使用は基本的に 2 つのステップに分かれており、1 つ目はオブジェクトをインスタンス化し、2 つ目は特定のデータに基づいてモデルをトレーニングします。

4.5 高度な機能 - パイプライン

Scikit-learn の Pipeline は、複数のステップをまとめて整理するツールであり、複数のステップを含むデータの前処理やモデリング プロセスによく使用されます。パイプラインには、ステップが順番に実行され、コードがクリーンになり、相互検証の実行時にデータ漏洩が防止されるという大きな利点があります。

パイプライン ワークフローは生産ラインに似ており、各ステップは独立していますが、すべてのステップが直列に接続されており、前のステップの出力が次のステップの入力として使用されます。一般的なパイプラインには、データ スケーリング (正規化や標準化など)、特徴選択、次元削減、最終モデル トレーニングなどのステップが含まれる場合があります。

コードを直接見てみましょう:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split

# 加载糖尿病数据集
diabetes = load_diabetes()
X_train, X_test, y_train, y_test = train_test_split(diabetes.data, diabetes.target, random_state=0)

# 创建一个Pipeline
pipe = Pipeline([
    ('scaler', StandardScaler()),  # 第一步是标准化
    ('regressor', LinearRegression())  # 第二步是线性回归
])

# 使用Pipeline进行训练
pipe.fit(X_train, y_train)

# 使用Pipeline进行预测
y_pred = pipe.predict(X_test)

y_pred

この例では、パイプラインが作成されます。これには 2 つのステップが含まれています: 1 つはStandardScalerデータの標準化に使用され、もう 1 つはLinearRegression回帰予測の実行に使用されます。次に、メソッドがトレーニング セットで呼び出されfit、パイプラインが各ステップを順番にトレーニングします (つまり、最初にデータで正規化し、次に正規化されたデータを使用して回帰モデルをトレーニングします)。メソッドがテスト セットで呼び出されるとpredict、パイプラインは各ステップで順番に予測を実行します (つまり、最初に正規化してから、トレーニングされた回帰モデルを使用して予測します)。

4.6 モデルの保存

モデルの永続性は、トレーニングされた機械学習モデルをディスクに保存し、後の時点 (おそらく別の環境) でそれをロードして使用する手法です。通常、適切なモデルをトレーニングするには多くの時間とコンピューティング リソースが必要になるため、これは非常に便利です。モデルがトレーニングされると、必要になるたびに再トレーニングするのではなく、将来的にモデルを再利用したくなる場合があります。

Scikit-learn では、Python の組み込みライブラリpickle、またはjoblibライブラリ (ビッグ データ専用のピクルスの一種) を使用してモデルを保存およびロードできます。

コードに直接:joblibモデルの保存と読み込みの使用方法を示します。

pythonCopy codefrom sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from joblib import dump, load

# 加载iris数据集并训练一个随机森林分类器
iris = load_iris()
clf = RandomForestClassifier()
clf.fit(iris.data, iris.target)

# 将模型保存到磁盘
dump(clf, 'randomforest_model.joblib') 

# 在需要的时候加载模型
clf_loaded = load('randomforest_model.joblib') 

# 使用加载的模型进行预测
y_pred = clf_loaded.predict(iris.data)

上記のコードでは、dump関数はモデルを指定されたファイルに保存し、load関数はファイルからモデルをロードします。モデルを保存およびロードするコードは通常、同じスクリプトまたはセッション内で実行されないことに注意してください。これはデモンストレーションのみを目的としています。

モデルに多数の numpy 配列 (たとえば、ニューラル ネットワークやランダム フォレストなどのモデル) が含まれている場合は、 を使用するよりも効率的でjoblibある可能性があります。pickleしたがって、Scikit-learn 公式ドキュメントでは、Scikit-learn を使用してjoblibモデルを保存およびロードすることを推奨しています。

5. 実践的な操作: Scikit-learn を使用して線形回帰モデリングを実装する

5.1 モデリングプロセス

  • ステップ 1:データを準備し、y = 2 x 1 − x 2 + 1 y=2x_1-x_2+1 を満たす 1000 個の基本ルールを生成するy=2倍_1バツ2+1分布回帰データセット
# 科学计算模块
import numpy as np
import pandas as pd

# 绘图模块
import matplotlib as mpl
import matplotlib.pyplot as plt

# 回归数据创建函数
def arrayGenReg(num_examples = 1000, w = [2, -1, 1], bias = True, delta = 0.01, deg = 1):
    """回归类数据集创建函数。

    :param num_examples: 创建数据集的数据量
    :param w: 包括截距的(如果存在)特征系数向量
    :param bias:是否需要截距
    :param delta:扰动项取值
    :param deg:方程最高项次数
    :return: 生成的特征张和标签张量
    """
    
    if bias == True:
        num_inputs = len(w)-1                                                           # 数据集特征个数
        features_true = np.random.randn(num_examples, num_inputs)                       # 原始特征
        w_true = np.array(w[:-1]).reshape(-1, 1)                                        # 自变量系数
        b_true = np.array(w[-1])                                                        # 截距
        labels_true = np.power(features_true, deg).dot(w_true) + b_true                 # 严格满足人造规律的标签
        features = np.concatenate((features_true, np.ones_like(labels_true)), axis=1)    # 加上全为1的一列之后的特征
    else: 
        num_inputs = len(w)
        features = np.random.randn(num_examples, num_inputs) 
        w_true = np.array(w).reshape(-1, 1)         
        labels_true = np.power(features, deg).dot(w_true)
    labels = labels_true + np.random.normal(size = labels_true.shape) * delta
    return features, labels

このコードの目的は、回帰のようなデータセットを作成することです。これは、特定のパターンを持つ回帰のようなデータセットを生成する関数を定義しますarrayGenRegこの関数は、指定されたパラメーターに基づいて特徴データとラベル データを生成し、オプションで切片項を追加します。特徴データは正規分布に従ってランダムに生成され、ラベルデータは定められたルールに従って計算され、正規分布に従う外乱項が付加されます。この関数の目的は、回帰問題用の人工データ セットの生成を容易にすることです。

  • ステップ 2: 関数に基づいて特徴データとラベル データを生成します。
# 设置随机数种子
np.random.seed(24)   

# 扰动项取值为0.01
features, labels = arrayGenReg(delta=0.01)

画像-20230703114334556

このステップでは、np.random.seed(24)を使用して乱数シードを 24 に設定します。これの目的は、後続のランダム生成プロセスが反復可能であること、つまり、コードを実行するたびに同じ乱数のシーケンスを取得できることを保証することです。次に、arrayGenReg関数を呼び出して回帰データセットの特徴とラベルを生成します。この例では、外乱項の値を 0.01、つまり に設定しますdelta=0.01

  • ステップ 3: 2 つのサブグラフを描画し、異なる特徴次元でのデータ セットの分布を観察します。
# 可视化数据分布
plt.subplot(121)
plt.plot(features[:, 0], labels, 'o')
plt.subplot(122)
plt.plot(features[:, 1], labels, 'o')

特徴行列のfeatures最初の列 ( features[:, 0])、2 番目の列 ( features[:, 1])、およびラベル列labels間の関係をそれぞれプロットします。

画像-20230703114707573

  • ステップ 4: Scikit-learn で線形回帰推定器を呼び出す

まず、Scikit-learn ライブラリから線形回帰推定量をインポートし、LinearRegressionその推定量を使用して線形回帰モデリングを実行します。

from sklearn.linear_model import LinearRegression

次に、線形回帰モデル オブジェクトを作成し、それをmodel名前付きの変数に割り当てます。

model = LinearRegression()

次に、以前に生成されたデータセットから特徴行列とラベルが抽出され、特徴行列によって最初の 2 つの特徴 ( ) が選択され、変数features[:, :2]に割り当てられます。Xタグ配列をy変数に代入します。

codeX = features[:, :2]  # 特征矩阵,选择前两个特征
y = labels  # 标签数组

最後に、エバリュエーターのメソッドを呼び出してfit()モデルをトレーニングします。

model.fit(X, y)

これらの手順を通じて、線形回帰モデルがトレーニングされ、データセット内のパターンと関連性が学習されます。

機械学習において、推定器はデータ パターンを学習して予測を行うために使用されるオブジェクトです。線形回帰推定量 (LinearRegression) は、線形モデルを近似するために使用される推定量です。

エバリュエーターをインスタンス化すると、使用できるエバリュエーター オブジェクトが作成されます。インスタンス化を通じて、エバリュエーターのパラメーターとプロパティを後続のトレーニングおよび予測操作用に設定できますこのコードでは、LinearRegression()線形回帰評価器のインスタンスが を使用して作成され、model変数に割り当てられます。

fit()メソッドは評価者の重要なメソッドであり、モデルをトレーニングするために使用されます。トレーニング プロセス中に、評価者は、提供された特徴行列とラベル データに基づいて損失関数を最小化することでモデルのパラメーターを調整し、データによりよく適合できるようにしますトレーニング プロセスを通じて、モデルは特徴とラベルの関係を学習し、予測モデルを構築できます。

要約すると、エバリュエーターをインスタンス化し、特徴行列とラベル データを提供し、fit()メソッドを呼び出してモデル トレーニングを実行することにより、エバリュエーターを使用してデータを近似し、未知のサンプルを予測できる線形回帰モデルを取得できます。

  • ステップ 5: モデルのトレーニング パラメーターを表示する
print("自变量参数:", model.coef_)
print("模型截距:", model.intercept_)

戻りパラメータは次のとおりです。

画像-20230703120003507

  • ステップ 6: 結果の解釈

独立変数パラメーター: モデルによって学習された独立変数パラメーターは [[1.99961892, -0.99985281]] であり、基本法則の [2, -1] に近い値です。これは、モデルがデータ生成のルールを適切に学習し、特徴間の関係を正確にモデル化できることを意味します。

モデル切片: モデルによって学習された切片は [0.99970541] であり、基本法則の 1 に近い値です。これは、特徴入力がない場合でも、モデルによって予測される出力値が依然として 1 に近いことを意味します。

したがって、モデルの独立変数パラメーターと切片の結果に基づいて、線形回帰モデルは基本法則の特徴間の関係を学習し、未知のサンプルを正確に予測できたと結論付けることができます。

  • ステップ 7: モデル評価に MSE を使用する

Scikit-learn ライブラリの平均二乗誤差 (MSE) 計算関数を使用して、予測値と真のラベルの間の平均二乗誤差を計算できます。

# 在metrics模块下导入MSE计算函数
from sklearn.metrics import mean_squared_error

# 输入数据,进行计算
mean_squared_error(model.predict(X), y)

これで、Scikit-learn の線形回帰モデルを呼び出すモデリング プロセスが完了しました。

5.2 ハイパーパラメータとは何ですか?

重要: 知っておくべき概念: ハイパーパラメータ

ハイパーパラメータとは、数学的プロセスを通じて最適に解決することはできませんが、モデルの形式やモデリングの結果に大きな影響を与える可能性がある要素を指します。たとえば、線形回帰では、方程式内の独立変数の係数や切片項の値が最適化されます。最小二乗法や勾配降下法で求めた解、切片項を入れるか、データを正規化するかなど、これらの要素もモデルの形状やモデリング結果に影響しますが、それは「人間の判断」によるオプションです。これらはいわゆるハイパーパラメータです。

Scikit-learn では、各エバリュエーターのハイパーパラメーターを設定するのは、エバリュエーター クラスのインスタンス化中に行われます。LinearRegression エバリュエーターの関連する命令を表示できます。ここで、パラメーター部分は、現在のモデルのハイパーパラメーターの関連する命令です。

画像-20230703121933604

上記のステップ 4 のプロセスで直接使用されるのは次のとおりです。

model = LinearRegression()

これは、デフォルトのパラメーターが使用されており、これらのハイパーパラメーターはインスタンス化プロセス中に設定および変更できるためです。たとえば、切片項を含まない線形方程式モデルを作成できます。

model1 = LinearRegression(fit_intercept=False)
model1.get_params()

画像-20230703134439570

インスタンス化されたエバリュエーターの場合、get_params を通じてモデリングに使用されるパラメーターを取得できます。

モデルをインスタンス化するプロセスでは、最終的なモデル トレーニングの期待を達成するために、モデルのハイパーパラメーターを慎重に選択する必要があります。モデルが異なればハイパーパラメーターも異なります。これは、その後の学習およびモデリングのプロセスにおいて非常に重要なポイントでもあります。

5.3 公式サイトでの機種運用ドキュメントの検索方法

公式 Web サイトで関連する評価者 (モデル) の説明を見つけることは、モデルの原理と使用法を理解するために非常に重要です。LinearRegression エバリュエーターを例として取り上げます。

線形回帰パラメータを計算するには、さまざまな方法があります。最小二乗法を使用して 1 ステップでパラメータを解決することも、勾配降下法によって反復的に解決することもできます。トレーニングのパラメータ解決方法についてさらに詳しく知りたい場合は、プロセスを完了するには、公式 Web サイトに戻る必要があります。評価者の指示を参照してください。まず、私たちはそれをすでに知っています。

LinearRegression は回帰モデルであるため、sklearn 公式 Web サイトの Regression セクションで説明する必要があります。

画像-20230703135642365

クリックすると、このモジュールの「1.1.1. Ordinary Least Squares」に、LinearRegression エバリュエーターに関する関連手順があることがわかります。どの評価者 (アルゴリズム モデル) についても、説明文書ではまずアルゴリズムの基本原理、アルゴリズムの式 (多くの場合、損失関数の計算式) と簡単な例が紹介され、必要に応じて、評価者が提案する関連論文へのリンクも追加されます。優れたアルゴリズムにより、ユーザーはすぐに使い始めることができます。

画像-20230703135901176

画像-20230703140050243

また、アルゴリズムのいくつかの特性についても説明します (これは、使用中に注意が必要な問題となることがよくあります)。結果はさらに悪くなり、大きなエラーになります。次に、ドキュメントではアルゴリズムの完全な使用プロセスが説明されており、これはドキュメントに散りばめられた例です。次に、このドキュメントでは、モデルを使用する際によく懸念されるいくつかの点について説明します。線形回帰については、2 つの一般的な問題がここにリストされています。1 つは、非負の最小二乗法の実装方法と最小二乗法の計算です。 。

画像-20230703140313506

Scikit-learn の公式ドキュメントは非常に詳しく充実しており、他のモデルを使用する場合も同様に学習して取得することで、そのモデルの原理や使い方を十分に理解することができます。

6. まとめ

この記事では、Scikit-learn の定義、インストール、コア オブジェクト タイプ (エバリュエーター) および主要な機能 (データ前処理、データ セットのセグメント化、データの標準化と正規化など) を含む、Scikit-learn の基本的な使用方法を詳細に説明し、実装方法を学習します。線形回帰モデル (ハイパーパラメータの概念の理解、モデルの保存と読み込み方法など) この記事が、Scikit-learn についての理解を深めていただくのに役立つことを願っています。

最後に、この記事を読んでいただきありがとうございます! 何か得をしたと思ったら、ぜひ「いいね!」「集めて!」「フォロー」を忘れずに、これが創作を続けるモチベーションです。ご質問やご提案がございましたら、コメント欄にメッセージを残していただければ、できる限りお答えし、フィードバックを受け付けさせていただきます。知りたい特定のトピックがございましたら、お知らせください。喜んでそれに関する記事を書きます。

サポートに感謝し、あなたと一緒に成長することを楽しみにしています!

おすすめ

転載: blog.csdn.net/Lvbaby_/article/details/131518929