9つの主要な回帰アルゴリズムと例のまとめ

9つの主要な回帰アルゴリズムと例のまとめ

線形回帰は、多くの場合、機械学習やデータサイエンスで最初に学ぶアルゴリズムです。シンプルでわかりやすいですが、機能が限られているため、実際のビジネスでは最適な選択とは言えません。ほとんどの場合、線形回帰は、研究中の新しい方法を評価および比較するためのベースライン モデルとして使用されます。

現実世界の問題に取り組む際に知っておくべき、試してみるべき回帰アルゴリズムは他にもたくさんあります。この記事では、Scikit-learn と XGBoost を使用した実践的な演習を通じて、9 つの一般的な回帰アルゴリズムを学習します。この記事は次のように構成されています。

序文

今回使用したデータは、Python サードパーティの vega_datasets モジュールに隠された、よく知られたデータ サイエンスの公開データセットです。

vega_datasets のデータ セットには、統計データ、地理データ、データ量の異なるバージョンなど、多くのコンテンツが含まれています。たとえば、フライト データ セットには、2k、5k、200k、3m などの複数のバージョンが含まれています。

呼び出しは、df = data('iris') または df = data.iris() と記述します。データは、Anaconda3/Lib/site-packages/vega_datasets ディレクトリにあります。ローカル データは、local_datasets.json に記述されています。ローカルストレージは csv 形式と json 形式です。

データセットのインポートと使用

 df = データ.車( )
df . ヘッド()

 df . 情報() 
 < クラス'pandas.core.frame.DataFrame' >
RangeIndex : 406 エントリ0 から405
データ合計9 ):
# 列非NULLカウントDtype
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
0 名前406 ヌルオブジェクト
1マイル/ ガロン398 null float64
2 シリンダ406 null int64
3 変位406 null float64
4 馬力400 null float64
5 Weight_in_lbs 406 null int64
6 加速406 null float64
7 406 null datetime64 [ ns ]
8 オリジン406 null オブジェクト
データ型: datetime64 [ ns ] ( 1 "ns" )、 float64 ( 4 )、 int64 ( 2 )、 object ( 2 )
メモリ使用量: 28.7+ KB

データ処理

 # 特定の列に NaN がある行をフィルタリングする
df . dropna ( サブセット= [ '馬力' , 'マイル/ガロン' ] , inplace = True )
df . sort_values ​​( by = '馬力'inplace = True )
# データ変換
X = df [ '馬力' ] .to_numpy () . reshape (-1,1 )
y = df [ 'マイル/ガロン' ] .to_numpy () . reshape ( -1,1 )
plt.scatter ( X , y , color = 'teal' , edgecolors = 'black' , label = '馬力vs.マイル/ガロン' )
plt . 凡例()
plt . 表示()

1. 線形回帰

線形回帰は、機械学習やデータサイエンスで最初に学習されるアルゴリズムであることが多いです。線形回帰は、入力変数 (X) と単一の出力変数 (y) の間に線形関係があると想定する線形モデルです。一般的に言えば、2 つの状況があります。

  • 単変量線形回帰: 単一の入力変数と単一の出力変数の関係をモデル化します。
  • 多変量線形回帰(多重線形回帰とも呼ばれます):複数の入力変数と単一の出力変数の関係をモデル化します。

このアルゴリズムは非常に一般的であり、Scikit-learn[2]には単純な線形回帰LinearRegression()アルゴリズムが組み込まれています。次に、小さなサルの LinearRegression オブジェクトを作成し、トレーニング データを使用してトレーニングします。

 from sklearn . linear_model import LinearRegression # モデルを作成してトレーニングする
linear_regressor = 線形回帰()
linear_regressor.fit ( X , y ) 関数

トレーニングが完了したら、LinearRegression の coef_ 属性でモデル係数パラメータを表示できます。

 線形回帰係数
 配列([[ - 0.15784473 ]])

次に、トレーニング済みのモデルを使用して、トレーニング データに線を当てはめます。

 # トレーニングデータの点と近似線をプロットする
plt.scatter ( Xycolor = 'RoyalBlue'edgecolors = 'black'label = '馬力 vs. マイル/ガロン' )
plt . plot ( Xlinear_regressor . predict ( X )、 color = 'orange'label = '線形回帰' )
plt . title ( '線形回帰' )
plt . 凡例()
plt . 表示()

まとめ

線形回帰に関するいくつかの重要なポイント:

  • 高速かつ簡単にモデル化できる
  • 線形回帰は、モデル化される関係がそれほど複雑ではなく、データがあまりない場合に特に役立ちます。
  • 非常に直感的に理解し、説明できます。
  • 外れ値に対して非常に敏感です。

2. 多項式回帰

多項式回帰は、非線形に分離可能なデータのモデルを作成する場合に最もよく使用される選択肢の 1 つです。これは線形回帰に似ていますが、変数 X と y の関係を使用し、データ ポイントに適合する曲線を描く最適な方法を見つけます。

多項式回帰の場合、独立変数の一部は 1 より大きい累乗を持ちます。たとえば、次のような二次モデルを提案することができます。

  • β_0、β_1、β_2は係数である
  • xは変数/特徴である
  • εは残差である

Scikit-learn には多項式回帰 PolynomialFeatures が組み込まれています。まず、指定された次数の多項式特徴すべてで構成される特徴行列を生成する必要があります。

 sklearn からの前処理インポートPolynomialFeatures
# 二次モデルの行列を生成する
# ここでは、X^0、X^1、X^2の行列を生成するだけです
poly_reg = 多項式特徴( 次数= 2 )
X_poly = poly_reg.fit_transform (X )

次に、LinearRegression オブジェクトを作成し、先ほど生成した X_poly 特徴行列に適合させます。

 # 多項式回帰モデル
poly_reg_model = 線形回帰()
poly_reg_model . fit ( X_poly , y )

このモデルをトレーニング データに線で当てはめると、X_plot は次のようになります。

 # トレーニングデータの点と近似線をプロットする
plt .scatter ( Xycolor = 'DarkTurquoise'edgecolors = 'black'
label = '馬力とマイル/ガロン' )
plt . plot ( Xpoly_reg_model . predict ( X_poly )、 color = 'orange'
ラベル= '多項式回帰変数' )
plt . title ( '多項式回帰' )
plt . 凡例()
plt . 表示()

まとめ

多項式回帰に関するいくつかの重要なポイント:

  • 非線形に分離可能なデータをモデル化する機能。線形回帰ではこれができません。全体的に柔軟性が高く、かなり複雑な関係をモデル化できます。
  • 特徴変数のモデリングを完全に制御します (設定指数を指定できます)。
  • 最適なインデックスを選択するには、慎重な設計とある程度のデータ知識が必要です。
  • インデックスが適切に選択されていない場合、過剰適合が発生しやすくなります。

3. サポートベクター回帰

サポートベクターマシンが分類問題の処理に非常に効果的であることはよく知られています。実際、SVM は回帰問題でもよく使用され、サポート ベクター回帰 (SVR) と呼ばれます。繰り返しになりますが、Scikit-learn には SVR() と呼ばれる組み込みメソッドがあります。

SVR モデルを適合する前に、データを正規化し、機能をスケーリングすることをお勧めします。データの正規化の目的は、各機能の重要性が同じになるようにすることです。 StandardScaler() メソッドを通じてトレーニング データを操作します。

 sklearn . svm からSVR をインポートします
from sklearn . preprocessing import StandardScaler # 特徴量のスケーリングを実行する
scaled_X = 標準スケーラー()
scaled_y = 標準スケーラー()
scaled_X = scaled_X.fit_transform ( X )
scaled_y = scaled_y.fit_transform ( y )

次に、カーネルを「rbf」に設定し、ガンマを「auto」に設定した SVR オブジェクトを作成しました。その後、fit() を呼び出して、スケーリングされたトレーニング データに適合させます。

 svr_regressor = SVR ( カーネル= 'rbf'ガンマ= 'auto' )
svr_regressor.fit ( scaled_X , scaled_y.ravel ())

次に、このモデルを使用して、次のようにトレーニング データ scaled_X に線を当てはめます。

 plt .scatter ( scaled_X , scaled_y , color = 'DarkTurquoise' ,
edgecolors = 'black'label = 'Train' )
plt.plot ( scaled_X , svr_regressor.predict ( scaled_X ) ,
= 'オレンジ'ラベル= 'SVR' )
plt . title ( '単純ベクトル回帰' )
plt . 凡例()
plt . 表示()

まとめ

サポートベクター回帰のいくつかの重要なポイント

  • 外れ値に対して堅牢であり、高次元空間でうまく機能します。
  • 優れた一般化能力(これまでに見たことのない新しいデータに正しく適応する能力)を備えています。
  • 特徴の数がサンプル数よりはるかに多い場合、過剰適合が発生しやすくなります。

4. 決定木回帰

決定木 (DT) は、分類と回帰のための非パラメトリックな教師あり学習法です。目標は、データの特徴から推論された単純な決定ルールを学習して、ターゲット変数の値を予測するツリー モデルを作成することです。ツリーは、区分的に定数近似として見ることができます。

決定木回帰も非常に一般的なので、Scikit-learn には DecisionTreeRegressor が組み込まれています。DecisionTreeRegressor オブジェクトは、次のようにして特徴スケーリングなしで作成できます。

 sklearn.tree からDecisionTreeRegressor インポートする
# 機能のスケーリングは自動的に処理されるため、必要ありません。
tree_regressor = 決定木回帰( random_state = 0 )
tree_regressor.fit ( X , y )

次に、トレーニング済みのモデルを使用してフィッティング曲線を描画します。

 X_grid = np . arange ( 最小( X ), 最大( X ), 0.01 )
X_grid = X_grid . reshape ( len ( X_grid ), 1 )
plt .scatter ( Xycolor = 'DarkTurquoise'
edgecolors = 'black'label = 'Train' )
plt.plot ( X_grid , tree_regressor.predict ( X_grid ) ,
color = 'オレンジ'label = 'ツリー回帰' )
plt . title ( 'ツリー回帰' )
plt . 凡例()
plt . 表示()

まとめ

決定木に関するいくつかの重要なポイント:

  • 理解しやすく解釈しやすく、意思決定ツリーを視覚的に表示できます。
  • 離散値と連続値の両方に適用できます。
  • DT を使用してデータを予測するコストは、ツリーのトレーニングに使用されるトレーニング データ ペアの数の対数になります。
  • 決定木の予測は滑らかでも連続でもありません (上の図に示すように、区分的に一定の近似値として表示されます)。

5. ランダムフォレスト回帰

一般的に、ランダム フォレスト回帰は、データセットのさまざまなサブサンプルに多数の決定木を適合させ、平均化を使用して予測精度を向上させ、過剰適合を制御するメタ推定器であるという点で、決定木回帰と非常によく似ています。

ランダム フォレスト回帰は、ツリー構築アルゴリズムに固有の微妙な過剰適合と不足適合のトレードオフにより、回帰では決定木よりもパフォーマンスが優れている場合とそうでない場合があります (ただし、分類では通常、パフォーマンスが優れています)。

ランダム フォレスト回帰は非常に一般的なので、Scikit-learn には RandomForestRegressor が組み込まれています。まず、次のように、指定された数の推定値を持つ RandomForestRegressor オブジェクトを作成する必要があります。

 sklearn.ensemble からRandomForestRegressor インポートする
forest_regressor = ランダムフォレスト回帰(
n_estimators = 300
ランダム状態= 0

forest_regressor.fit ( X , y.ravel ())

次に、トレーニング済みのモデルを使用してフィッティング曲線を描画します。

 X_grid = np . arange ( 最小( X ), 最大( X ), 0.01 )
X_grid = X_grid . reshape ( len ( X_grid ), 1 )
plt .scatter ( Xycolor = 'DarkTurquoise'
edgecolors = 'black'label = 'Train' )
plt.plot ( X_grid , forest_regressor.predict (X_grid ) ,
color = 'オレンジ'label = 'ランダムフォレスト回帰' )
plt . title ( 'ランダムフォレスト回帰' )
plt . 凡例()
plt . 表示()

まとめ

ランダム フォレスト回帰に関する重要なポイントをいくつか紹介します。

  • 決定木の過剰適合を減らし、精度を向上させるために注意を払う必要がある
  • また、離散値と連続値の両方で機能します。
  • 多くの決定木を適合させてその出力を組み合わせるため、多くの計算能力とリソースが必要となる。

6. LASSO回帰

LASSO 回帰は、収縮を使用する線形回帰のバリエーションです。収縮とは、データ値を平均として中心点に向かって縮小するプロセスです。このタイプの回帰は、重度の多重共線性(特徴が互いに強く相関している)を示すモデルに適しています。

Scikit-learn には LassoCV が組み込まれています。

 sklearn.linear_model からLassoCV インポートする
ラッソ= LassoCV ()
lasso.fit ( X , y.ravel ()) 囲む

次に、トレーニング済みのモデルを使用してフィッティング曲線を描画します。

 plt .scatter ( Xycolor = 'teal'edgecolors = 'black'
label = '実際の観測点' )
plt.plot ( X , lasso.predict ( X ) , color = ' orange' ,
ラベル= 'LASSO回帰変数' )
plt . title ( 'LASSO 回帰' )
plt . 凡例()
plt . 表示()

まとめ

Lasso 回帰に関するいくつかのポイント:

  • 自動変数を排除し、機能を選択するために最もよく使用されます。
  • これは、重度の多重共線性 (特徴が互いに高度に相関している) を示すモデルに適しています。
  • L1正則化を用いたLASSO回帰
  • LASSO 回帰は、一部の特徴のみを選択し、他の特徴の係数をゼロに減らすため、Ridge 回帰よりも優れていると考えられています。

7. リッジ回帰

リッジ回帰は、両方の手法が収縮を使用するという点で、LASSO 回帰と非常によく似ています。リッジ回帰と LASSO 回帰はどちらも、重度の多重共線性 (互いに高度に相関する特徴) を示すモデルに適しています。それらの主な違いは、Ridge が L2 正則化を使用する点です。つまり、LASSO 回帰のように係数がゼロになることはありません (むしろゼロに近くなります)。

Scikit-learn には RidgeCV が組み込まれています。

 sklearn.linear_model からRidgeCV インポートする
リッジ= RidgeCV ()
尾根. フィット( X , y )

次に、トレーニング済みのモデルを使用してフィッティング曲線を描画します。

 plt .scatter ( Xycolor = 'teal'edgecolors = 'black'
ラベル= '電車' )
plt.plot ( X , ridge.predict ( X ) , color = 'orange' ,
ラベル= 'リッジ回帰' )
plt . title ( 'リッジ回帰' )
plt . 凡例()
plt . 表示()

まとめ

リッジ回帰に関するいくつかの重要なポイント:

  • これは、重度の多重共線性 (特徴が互いに高度に相関している) を示すモデルに適しています。
  • リッジ回帰では L2 正則化が使用され、寄与の小さい特徴の係数はゼロに近くなります。
  • L2 正則化の性質上、リッジ回帰は LASSO よりも劣ると考えられています。

8. ElasticNet回帰

ElasticNet は、L1 および L2 正則化を使用してトレーニングされた別の線形回帰モデルです。これは LASSO とリッジ回帰手法のハイブリッドであるため、重度の多重共線性 (特徴が互いに高度に相関している) を示すモデルにも適しています。

Lasso と Ridge のトレードオフの実際的な利点は、Elastic-Net が回転時に Ridge の安定性の一部を継承できることです。

Scikit-learn には ElasticNetCV モデルが組み込まれています。

 sklearn.linear_model からElasticNetCV をインポートします
エラスティックネット= ElasticNetCV ()
elasticNet.fit ( X , y.ravel ())

次に、トレーニング済みのモデルを使用してフィッティング曲線を描画します。

 plt .scatter ( Xycolor = 'DarkTurquoise'edgecolors = 'black'label = 'Train' )
plt . plot ( XelasticNet . predict ( X )、 color = 'orange'label = 'ElasticNet regressor' )
plt . title ( 'ElasticNet 回帰' )
plt . 凡例()
plt . 表示()

まとめ

ElasticNet 回帰のいくつかの重要なポイント:

  • ElasticNet は、両方のアルゴリズムの欠点を解決するため、常に LASSO や Ridge よりも優れています。
  • ElasticNet は、最適なソリューションを決定するために使用される 2 つのラムダ値に対して追加のオーバーヘッドを導入します。

9. XGBoost回帰

Extreme Gradient Boosting (XGBoost) は、勾配ブースティング アルゴリズムの効率的な実装です。勾配ブースティングとは、分類や回帰の問題に使用できるアンサンブル機械学習アルゴリズムのクラスを指します。

XGBoostは、もともとtianqi-chen[3]が2016年に発表した論文「XGBoost: A Scalable Tree Boosting System[4]」で開発されたオープンソースライブラリです。このアルゴリズムは計算効率と効果を高めるように設計されています。

最初のステップは、まだインストールしていない場合は XGBoost ライブラリをインストールすることです。

 xgboostpip でインストールする

XGBoost モデルは、XGBRegressor のインスタンスを作成することによって定義できます。

 xgboost からXGBRegressor をインポートする
# xgboost回帰モデルを作成する
モデル= XGBRegressor (
n_estimators = 1000
最大深度= 7
η = 0.1
サブサンプル= 0.7
列サンプル_bytree = 0.8

  • n_estimators: アンサンブル内のツリーの数。通常は、それ以上の改善が見られなくなるまで増加します。
  • max_depth: 各ツリーの最大深度。通常は 1 ~ 10 です。
  • eta: 各モデルの重み付けに使用される学習率。通常は 0.3、0.1、0.01 などの小さな値に設定されます。
  • subsample: 各ツリーに使用するサンプルの数。0 ~ 1 の間の値に設定します。通常は、すべてのサンプルを使用する場合は 1.0 に設定します。
  • colsample_bytree: 各ツリーで使用する特徴 (列) の数。0 ~ 1 の間の値に設定され、通常はすべての特徴を使用する場合は 1.0 になります。

次に、トレーニング済みのモデルを使用してフィッティング曲線を描画します。

 plt .scatter ( Xycolor = 'DarkTurquoise'edgecolors = 'black'label = 'Train' )
plt.plot ( X , model.predict ( X ), color = 'orange' , label = 'XGBoost回帰モデル' )
plt . title ( 'XGBoost 回帰' )
plt . 凡例()
plt . 表示()

まとめ

XGBoost に関する重要なポイントをいくつか紹介します。

  • XGBoost は、スパースな非構造化データではパフォーマンスが低下します。
  • このアルゴリズムは計算効率とパフォーマンスに優れているように設計されていますが、大規模なデータセットの場合、トレーニング時間は依然としてかなり長くなります。
  • 外れ値に非常に敏感

最後に

これでこの記事は終わりです。この記事では、Scikit-learn と XGBoost を使用した実践的な演習を通じて、9 つの一般的な回帰アルゴリズムを紹介しました。現実世界の問題を解決するときは、さまざまなアルゴリズムを試して、現実世界の問題を解決するための最適な回帰モデルを見つけることができます。

<<:  都市と市民がスマートシティ技術から得られる恩恵

>>:  AI 実装の倫理的な展開をどのように確保するか?

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

...

DALL·E 3のベンチマーク!メタ最強の文豪エミュの技術レポートを公開

数日前、OpenAIはDALL·E 3をリリースしたばかりで、ビジュアルイメージは再び新たな段階に上...

ウナギの下半身は切り落とされた後もまだ動きます。ロボット: 受け取ってください。

[[418811]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitA...

人工知能のアプリケーションアーキテクチャを考える

[[408914]] 1. パドルライトとパドルスリム現在、ディープラーニングの分野には 2 つの派...

データの品質は機械学習を成功させる鍵です

翻訳者 | 張毅校正 | 梁哲、孫淑娟出典: frimufilms が作成したビジネス写真 - ww...

...

家族に王位継承者はいないのですか?それは問題ではない、誰かがAIを使っておとぎ話の魔法の世界を作ったのだ

家には鉱山も王座もありませんが、王子様やお姫様になりたいという夢を持たない人がいるでしょうか?最近、...

機械翻訳: Google 翻訳がほぼすべての言語を翻訳できる仕組み

[[345484]]誰もが Google 翻訳をよく知っているはずですが、ほぼすべての既知の言語を私...

...

Google Cloud Next: カンファレンス全体を通じて人工知能について語る

最近、Google は年次カンファレンス Google Cloud Next を開催しましたが、オー...

人工知能クロニクル | これら 10 大イベントは、人工知能の 64 年間の発展を記録しています

1956 年の夏、アメリカの小さな町ハノーバーの静かなダートマス大学に、ジョン・マッカーシー (Li...

デジタルツインの登場: 医薬品開発における今後の革命

51年前、アポロ13号が宇宙に打ち上げられました。打ち上げ直後、宇宙船は大きな爆発に遭遇した。宇宙船...

マイクロソフトはBing Chatを今後も無料のままにすると約束

近年、OpenAI、Microsoft、Google など多くの企業やスタートアップチームが独自のチ...