Scikit-Learn をマスターする: Python での機械学習ライブラリの入門

概要

機械学習は、近年テクノロジーニュース、研究レポート、業界分析、実用化などで頻繁に登場する人気の分野です. 機械学習は、前例のないスピードで私たちの生活に影響を与えています. スマートスピーカーの開発から. 音声認識から, 顔のロック解除から.携帯電話のカメラから金融分野の評価、医療や健康の予測分析まで、機械学習の応用はすでに生活のあらゆる側面に浸透していますが、初心者にとっては Scikit-Learn が最適です。

Scikit-Learn をマスターする

Scikit-Learn (Sklearn と呼ばれます) は、Python 用のオープンソース機械学習ライブラリです。その誕生以来、徐々に機械学習分野の標準ライブラリになりました。Sklearn は、基本的な線形回帰 (線形回帰)、分類から、高度な統合手法とモデルの最適化まで、機械学習のほぼすべての側面をカバーしていますが、より重要なのは、Scikit-Learn の設計哲学が、独自のタスクを完了するのに役立つシンプルで効率的で信頼性の高いツールをユーザーに提供していることです。

今日は、シャオバイさん、Scikit-Learn の基本を包括的に理解できるようにご案内します。インストールと構成から始まり、そのコア コンポーネント、推定器、モデルのトレーニングと評価について説明し、その後、実際のアプリケーション ケースについて徐々に説明していきます。この強力なライブラリを探索してください。この記事の最後で、読者は Scikit-Learn を使用して実際的な問題を解決できるようになります。

機械学習と Python の完璧な組み合わせ

まず質問を検討してみましょう: なぜ機械学習のプログラミング言語として Python を選択するのですか? この質問に対する答えは、さまざまな角度から見ることができます。まず第一に、Python は簡潔で明確な構文を持つ汎用の高レベル プログラミング言語です。さらに、Python には、データ分析、視覚化、ディープラーニングまであらゆる側面をカバーするオープンソース ライブラリとフレームワークが豊富にあり、データ サイエンスと機械学習の分野で Python に大きな利点を与えています。 。

第二に、Python には多数のオンライン リソース、チュートリアル、ケースを備えた活発なコミュニティがあり、貴重な学習教材を提供してくれるだけでなく、Python のクロスプラットフォーム機能により、開発者はさまざまなオペレーティング システムで簡単に展開して実行できます。 。

では、Python の機械学習ライブラリとして Scikit-Learn を選択する理由は何でしょうか? 他のライブラリと比較して、Scikit-Learn には明確な利点があります。まず、データの前処理、モデルのトレーニング、評価のいずれにおいても、その API 設計が統一され明確です。ユーザーは数行の短いコードでそれを完了できます. さらに、Scikit-Learn には完全なドキュメントがあり、多数の例とガイダンスが提供されているため、学習の難しさが大幅に軽減されます. 最後に、Scikit-Learn は実装されたライブラリですこれは、多くの複雑な依存関係をインストールしたり、他のライブラリとの互換性の問題を心配したりする必要がないことを意味します。

Scikit-Learn のコアコンポーネントと構造

インストールと構成

Scikit-Learn は、Python の科学計算機能を提供する 2 つのライブラリであるNumpy と SciPy に依存しています。したがって、 Scikit-Learn をインストールする前に、これら 2 つのライブラリがインストールされていることを確認してください。

Scikit-Learn をインストールします。

pip install scikit-learn

コンダ:

conda install scikit-learn

インストールの確認

インストールが成功したかどうかを確認します。

import sklearn

print(sklearn.__version__)

データ表現と前処理

Scikit-Learn では、データは Numpy 配列または特徴行列であり、サンプルは行列の行、特徴は行列の列です。

特徴行列とターゲット ベクトル

機能マトリックス:

  • 通常は「X」で表され、形状は「[n_samples, n_features」です。
    ターゲット ベクトル
  • 教師あり学習問題を扱うときは、通常「y」で示されるラベルの配列も必要になります。

情報処理

Scikit-Learn は、データの前処理に役立つさまざまな実用的なツールを提供します。

  • スケーリング: 「StandardScaler」など、データの標準化に役立ちます
  • エンコーディング: 「OneHotEncoder」など、カテゴリ特徴量を数値に変換します。
  • 補完:「SimpleImputer」を使用して欠落データを処理

推定者

Scikit-Learn の推定器は、さまざまな機械学習アプリケーションに一貫したインターフェイスを提供します。

中心となる概念は次のとおりです。

  • 推定器: すべてのアルゴリズムの実装は推定器です。たとえば、線形回帰も推定器であり、k の最近傍も推定器です。
  • Transformer: データに対して何らかの変換を実行できる推定器
  • Predictor: 入力データに基づいて予測できる推定器

基本的な手順は次のとおりです。

  1. モデルを選択し、対応する推定クラスをインポートします
  2. モデルパラメータを選択し、クラスをインスタンス化し、ハイパーパラメータ値を設定します
  3. 特徴行列とターゲット ベクトルごとにデータを整理する
  4. 推定器のfit()モデルをトレーニングするメソッドの呼び出し
  5. 予測にメソッドを使用しますpredict()

例:

"""
@Module Name: Scikit-Learn 估计器.py
@Author: CSDN@我是小白呀
@Date: October 15, 2023

Description:
Scikit-Learn 估计器
"""
from sklearn.linear_model import LinearRegression

# 创建数据
X = [[1], [2], [3]]
y = [2, 4, 6]

# 实例化模型
model = LinearRegression()

# 训练模型
model.fit(X, y)

# 预测
predict = model.predict([[4]])
print("预测结果:", predict)

出力結果:

预测结果: [8.]

機種選定

機械学習において、モデルの選択は最も重要なステップの 1 つです。適切なモデルを使用すると予測の精度が大幅に向上しますが、不適切なモデルを使用すると、予測結果が期待する結果から大幅に逸脱する可能性があります。

したがって、モデルを選択する前に、まず解決したい問題を明確にする必要があります 機械学習の問題は、主に分類問題 (Classification) と回帰問題 (Regression) の 2 つのカテゴリに分類されます。

問題の性質について考える

モデルを選択する前に、まず問題の性質を明確にする必要があります。一部の問題は一見分類問題のように見えますが、実際には回帰モデルを使用する方が適切です。例: 学生の合格率の予測最終試験は分類問題 (合格/不合格 合格) と見なすことができますが、実際には、回帰モデルを使用してスコアを予測することで、より良い結果を得ることができます。

データの分布を調査する

データの分布と特徴もモデルの選択に重要です。モデルが異なれば、データごとに異なるパフォーマンスが得られます。たとえば、分類されたデータ (一部の種類のデータはデータ量がはるかに多い) が不均衡に分布している場合 (他のカテゴリと比較して)、アップサンプリングまたはサブサンプリングを通じてアンバランスなデータ型を処理します。

タスクの複雑さを判断する

問題の複雑さも考慮すべき重要な要素です。線形回帰やロジスティック回帰などの単純な線形モデルは、線形分離可能な問題には適しています。しかし、より複雑な非線形問題の場合は、デシジョン ツリー (デシジョン ツリー) の使用が必要になる場合があります。 Tree)、ランダム フォレスト、その他の複雑なモデル。

線形と非線形:

  • 線形:
    • 線形関係とは、2 つ以上の変数 (変数) 間の関係が線形関係であることを意味します
    • 数学における線形関係は、 y = w x + b y=wx + b として表すことができます。そして=wx+b ここで、w は重み (Weight)、b はバイアス (Bias) です
    • 線形システムでは、入力と出力の関係は比例します。
  • 非線形:
    • 非線形性とは、変数間の関係が曲線など、非線形であることを意味します。
    • 非線形方程式には、多項式、指数関数、対数が含まれます。
    • 非線形システムでは、入力と出力の関係が複雑です

分類問題

分類問題 (分類) は、映画の種類やオブジェクトが猫か犬かを判断するなど、出力変数をカテゴリとして予測することを指します。

分類問題の機械学習モデルには次のものがあります。

  • 線形モデル: ロジスティック回帰
  • 非線形モデル: k 最近傍 (KNN)、デシジョン ツリー (Decision Tree)、サポート ベクター マシン (SVM)

回帰問題

回帰問題 (回帰) は、興行収入の予測、住宅価格の予測など、予測される出力変数が連続値であることを意味します。

回帰問題の機械学習モデルには次のものがあります。

  • 線形モデル: 線形回帰
  • 非線形モデル: デシジョン ツリー リグレッサー、ランダム フォレスト

教師あり学習

教師あり学習は機械学習の中核であり、その目標は、ラベル付きデータからモデルを学習し、未知のデータのラベルを予測することです。

分類アルゴリズム

ロジスティック回帰: 名前に「回帰」が付いていますが、ロジスティック回帰モデルは分類モデルであり、主に二項分類問題に使用されます。ロジスティック回帰は、シグモイド関数を通じて確率値を出力し、入力サンプルの分類を提供します。

例:

from sklearn.linear_model import LogisticRegression

clf = LogisticRegression()
clf.fit(X_train, y_train)

デシジョン ツリー: 理解と説明が容易で、分類および回帰タスクに使用できる画像ベースのアルゴリズム。

例:

from sklearn.tree import DecisionTreeClassifier

tree = DecisionTreeClassifier()
tree.fit(X_train, y_train)

回帰アルゴリズム

線形回帰: データ内で最も適合する直線を見つけ、連続的な出力を予測します。

例:

from sklearn.linear_model import LinearRegression

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

サポート ベクター回帰 (SVR、サポート ベクター回帰): サポート ベクター マシンを使用して回帰を実行します。

例:

from sklearn.svm import SVR

svr = SVR()
svr.fit(X_train, y_train)

教師なし学習

教師なし学習は、ラベルのないデータからパターンを見つける教師あり学習とは異なります。

K 平均法: データを k 個のクラスターに分割します。

例:

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=3)
kmeans.fit(X)

主成分分析 (PCA): 可能な限り多くの情報を保持しながら、データの次元を削減します。

例:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

グリッド検索: さまざまなパラメーターの組み合わせを体系的に調べ、相互検証を通じて最小効果パラメーターを決定します。

例:

from sklearn.model_selection import GridSearchCV

param_grid = {'C': [0.1, 1, 10], 'gamma': [1, 0.1, 0.01]}
grid = GridSearchCV(SVR(), param_grid, refit=True)
grid.fit(X_train, y_train)

ランダム化検索: グリッド検索に似ていますが、すべてのパラメーターを試す代わりに、指定された数のパラメーターの組み合わせがランダムにサンプリングされます。

モデルの評価

機械学習のプロセスでは、適切なモデルを選択することが重要であり、同様に、過小適合や過適合の問題を回避するために、モデルが期待を満たしているかどうかを理解するためにモデルのパフォーマンスを評価する必要があります。

トレーニングセットと検証セット

モデルの効果を評価するにはベンチマークが必要です。そのため、トレーニング セットとテスト セットに分割する必要があります。トレーニング セットはモデルのトレーニング (Train) に使用され、データの一部はテスト用に残ります。検証セット (有効) であるモデル、およびモデルのトレーニングにすべてのデータが使用されるわけではありません。

分類モデルの評価

混同行列: 真の例、陰性の陽性例、偽陽性の例、および偽陰性の例を含む、モデルの真の値と予測値の間の関係を表します。

例:

from sklearn.metrics import confusion_matrix

y_pred = clf.predict(X_test)
matrix = confusion_matrix(y_test, y_pred)
print(matrix)

精度、再現率、F1 (F1 スコア): 精度、範囲、バランスなど、分類器のさまざまな側面を評価します。

例:

from sklearn.metrics import classification_report

report = classification_report(y_test, y_pred)
print(report)

回帰モデルの評価

平均二乗誤差 (MSE、平均二乗誤差): モデル予測の精度を測定します。

例:

from sklearn.metrics import mean_squared_error

mse = mean_squared_error(y_test, y_pred)
print(mse)

R^2 スコア (R 二乗スコア): 変数を説明するモデルの能力を測定します。値が 1 に近いほど優れています。

例:

from sklearn.metrics import r2_score

r2 = r2_score(y_test, y_pred)
print(r2)

相互検証では、データを複数のサブセットに分割し、各サブセットに対して複数のトレーニング/テスト分割を実行します。たとえば、一般的な k 分割 (k-Fold) 相互検証方法では、データが k 個のサブセットに分割されます。各検証では、サブセットの 1 つは検証セットとして使用され、他のサブセットはトレーニング セットとして使用されます。このようにして、k 個の異なるモデルのパフォーマンス評価を取得でき、これらの評価の平均を得ることができます。モデルのより正確な評価が提供されます。パフォーマンス。

例:

"""
@Module Name: 模型的评估.py
@Author: CSDN@我是小白呀
@Date: October 16, 2023

Description:
模型的评估
"""
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, recall_score, f1_score

# 加载 iris 数据集
data = load_iris()
X = data.data
y = data.target

# 实例化随机森林
clf = RandomForestClassifier(n_estimators=50, random_state=42)

# 分割训练集 & 验证集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 使用 KFold 进行5折交叉验证
kf = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(clf, X, y, cv=kf)
print("交叉验证平均得分:", scores.mean())

# 训练模型
clf.fit(X_train, y_train)

# 评估指标
y_pred = clf.predict(X_test)
print("精度:", accuracy_score(y_test, y_pred))
print("召回率:", recall_score(y_test, y_pred, average='macro'))  # 多分类问题使用宏平均
print("F1分数:", f1_score(y_test, y_pred, average='macro'))  # 多分类问题使用宏平均

出力結果:

交叉验证平均得分: 0.9600000000000002
精度: 1.0
召回率: 1.0
F1分数: 1.0

特徴エンジニアリング

特徴量エンジニアリングは機械学習の重要なステップであり、適切な特徴量を作成して選択することで、モデルのパフォーマンスを大幅に向上させることができます。

機能の選択

特徴選択は、無関係または冗長な特徴を排除しながら、ターゲット変数に関連する特徴を選択するプロセスです。

機能選択の利点は次のとおりです。

  1. モデルの複雑さを軽減する
  2. 過剰適合のリスクを軽減する
  3. モデルのトレーニング速度の向上

例:
住宅価格を予測するためのデータセットがあるとします。このデータセットには、部屋の数、地理的位置、建設年、新築かどうかなどの多くの特徴が含まれています。地下鉄の駅などに近い。ただし、家主の名前、プールの有無など、あまり関連性の低い特徴も含まれる場合があります。特徴の選択を通じて、住宅に最も関連性の高い特徴のみを選択できます。モデルをトレーニングするための価格

コード:

"""
@Module Name: 特征选择.py
@Author: CSDN@我是小白呀
@Date: October 16, 2023

Description:
通过波士顿房价数据集, 说明特征选择
"""
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.feature_selection import SelectKBest, f_regression

# 使用 Boston 房价数据集作为示例
data = load_boston()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['PRICE'] = data.target

# 假设我们增加了一些不相关的特征
df['LANDLORD_NAME'] = np.random.choice(['Alice', 'Bob', 'Charlie'], df.shape[0])
df['HAS_POOL'] = np.random.choice([0, 1], df.shape[0])

# 将分类特征转化为数字
df['LANDLORD_NAME'] = df['LANDLORD_NAME'].astype('category').cat.codes

# 分割数据
X = df.drop('PRICE', axis=1)
y = df['PRICE']

# 使用 SelectKBest 进行特征选择
# 为了确定与房价最相关的特征, 我们可以使用f _regression 作为评分函数
selector = SelectKBest(score_func=f_regression, k=2)
X_new = selector.fit_transform(X, y)

# 打印被选中的特征
selected_features = pd.DataFrame(selector.inverse_transform(X_new),
                                 columns=X.columns)
selected_columns = selected_features.columns[selected_features.var() != 0]
print('选择的特征:', selected_columns)

出力結果:

选择的特征: Index(['RM', 'LSTAT'], dtype='object')

特徴抽出

特徴抽出は、生データを代表的な少数の特徴のセットに変換するプロセスです。特徴の選択とは異なり、特徴抽出では新しい特徴が作成されます。主成分分析 (PCA) は、一般的に使用される特徴抽出方法です。

例:

"""
@Module Name: 特征提取.py
@Author: CSDN@我是小白呀
@Date: October 16, 2023

Description:
人脸识别数据集, 说明特征提取
"""
from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 加载人脸数据集
lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)
X = lfw_people.data
n_samples, n_features = X.shape

# 原始图像的维度
h, w = lfw_people.images.shape[1:3]

# PCA 转换, 提取 150 个主要成分
n_components = 150
pca = PCA(n_components=n_components, whiten=True).fit(X)
X_pca = pca.transform(X)

# 可视化主要成分的效果
def plot_gallery(images, titles, h, w, n_row=5, n_col=5):
    plt.figure(figsize=(1.8 * n_col, 2.4 * n_row))
    plt.subplots_adjust(bottom=0, left=.01, right=.99, top=.90, hspace=.35)
    for i in range(n_row * n_col):
        plt.subplot(n_row, n_col, i + 1)
        plt.imshow(images[i].reshape((h, w)), cmap=plt.cm.gray)
        plt.title(titles[i], size=12)
        plt.xticks(())
        plt.yticks(())

eigenfaces = pca.components_.reshape((n_components, h, w))
eigenface_titles = ["eigenface %d" % i for i in range(eigenfaces.shape[0])]
plot_gallery(eigenfaces, eigenface_titles, h, w)

# 绘图
plt.show()

出力結果:
PCA

おすすめ

転載: blog.csdn.net/weixin_46274168/article/details/133847852