Pythonにおける線形回帰入門


線形回帰は出力変数を予測するために歴史的データを使用する基本予測解析手法である.それは簡単に理解され、平易な英語を使用して説明することができるため、予測モデリングに人気があります.
線形回帰モデルは、経済学(例えば、成長を予測する)、ビジネス(例えば、製品の販売、従業員のパフォーマンスを予測する)、社会科学(例えば、性別や人種からの政治的な収入を予測する)、ヘルスケア(例えば、体重からの血圧レベル、生物学的要因からの病気の発症)を予測するなど、多くの実世界のアプリケーションを多数の実世界アプリケーションを有している.
線形回帰モデルを実行する方法を理解することは、重要な問題を解決するためにデータのストーリーを解き放つことができます.私たちはPythonを使用します.それは、処理、処理、およびモデルデータを扱うための強力なツールです.これは、線形回帰モデリングのパッケージの配列があります.
基本的な考えは、我々が観測データに線形回帰モデルを適合させることができれば、我々はそれから将来の値を予測するためにモデルを使用することができるということです.例えば、私たちが歴史的なデータから、家の価格(P)がそのサイズ(s)に線形に依存しているとわかりました — 実際、我々は家の価格がちょうどその90倍の大きさであることを発見しました.次のようになります.
p = 90 * s
このモデルでは、我々は、任意の家のコストを予測することができます.1500平方フィートの家があれば、その価格を計算することができます.
p = 90 * 1500 = 13 , 000
このブログの投稿では、以下をカバーします
  • モデルの背後にある基本概念と数学
  • シミュレートされたデータを使用しているスクラッチから線形回帰を実行する方法
  • 線形回帰を使用する方法statsmodels
  • 線形回帰を使用する方法scikit-learn
  • この簡単なチュートリアルでは、次のXYZ線形回帰から、Pythonのコースでは、ブラウザのサンドボックス環境、タスクを完了するには、タスクを完了し、公共のデータセットを使用してプロジェクトです。


    基礎概念と数学


    線形回帰モデルには2種類の変数がある.
  • 入力変数または予測変数は出力変数の値を予測する変数です.一般的にXと呼ばれる.
  • 出力変数は予測したい変数です.一般的にはYと呼ばれる.
  • 線形回帰を用いてyを推定するには、式を仮定します.

    Yₑ = α + β X


    どこでYₑ yの推定値は予測値である.
    我々の目標はYとYの違いを最小にするパラメータαとβの統計的に重要な値を見つけることであるₑ.
    これらの2つのパラメータの最適値を決定することができれば、xの値を与えられたyの値を予測するために最善のフィット線を持つことになります.
    では,αとβをどのように推定するか?私たちは、いわゆるordinary least squares .

    通常最小二乗



    緑の線は、実際の値yと推定値yₑ
    最小二乗法の目的は,yとyの二乗差の和を最小にするαとβの値を求めることであるₑ. 私たちはここで派生を通過しません、しかし、微積分を使用して、我々は未知のパラメタの値が以下の通りであることを示すことができます:

    ここで、xはx値の平均値である.
    あなたが統計に精通しているならば、あなたは単に
    cov ( x , y )/var ( x )

    ゼロからの線形回帰


    このポストでは、二つのPythonモジュールを使います.
  • statsmodels  —  a module それは多くの異なる統計モデルの推定のためのクラスと機能を提供します、統計的なテストを実行するのと同様に、そして、統計的データ探査.
  • scikit-learn  —  a module これは、データマイニングやデータ解析のためのシンプルで効率的なツールを提供します.
  • 飛び込む前に、モデルをどのように実装するかを理解するのは役に立ちます.パッケージがどのように舞台裏で働くかを知ることは重要です.
    開始するには、いくつかのデータをシミュレートし、どのように予測値ₑ) は実際の値( y )と異なる.
    import pandas as pd
    import numpy as np
    from matplotlib import pyplot as plt
    
    # Generate 'random' data
    np.random.seed(0)
    X = 2.5 * np.random.randn(100) + 1.5   # Array of 100 values with mean = 1.5, stddev = 2.5
    res = 0.5 * np.random.randn(100)       # Generate 100 residual terms
    y = 2 + 0.3 * X + res                  # Actual values of Y
    
    # Create pandas dataframe to store our X and y values
    df = pd.DataFrame(
        {'X': X,
         'y': y}
    )
    
    # Show the first five rows of our dataframe
    df.head()
    
    上記のコードが実行されている場合(例えばJupyterノートブックで)、次のように出力されます.

    OLSメソッドを使用してYを推定するには、計算する必要がありますxmean and ymean , xとyの共分散xycov ), とxの分散xvar ) 値を決定する前にalpha and beta .
    # Calculate the mean of X and y
    xmean = np.mean(X)
    ymean = np.mean(y)
    
    # Calculate the terms needed for the numator and denominator of beta
    df['xycov'] = (df['X'] - xmean) * (df['y'] - ymean)
    df['xvar'] = (df['X'] - xmean)**2
    
    # Calculate beta and alpha
    beta = df['xycov'].sum() / df['xvar'].sum()
    alpha = ymean - (beta * xmean)
    print(f'alpha = {alpha}')
    print(f'beta = {beta}')
    
    Out:
    alpha = 2.0031670124623426
    beta = 0.32293968670927636
    
    グレート、我々は今の見積もりを持ってalpha and beta ! 私たちのモデルはYₑ = 2.003 + 0.323 xと予測を行うことができます.
    ypred = alpha + beta * X
    
    Out:
    array([3.91178282, 2.81064315, 3.27775989, 4.29675991, 3.99534802,
           1.69857201, 3.25462968, 2.36537842, 2.40424288, 2.81907292,
           ...
           2.16207195, 3.47451661, 2.65572718, 3.2760653 , 2.77528867,
           3.05802784, 2.49605373, 3.92939769, 2.59003892, 2.81212234])
    
    予測を練りましょうypred 実際の値に対してy , 私たちのモデルのより良い視覚理解を得るために.
    # Plot regression against actual data
    plt.figure(figsize=(12, 6))
    plt.plot(X, ypred)     # regression line
    plt.plot(X, y, 'ro')   # scatter plot showing actual data
    plt.title('Actual vs Predicted')
    plt.xlabel('X')
    plt.ylabel('y')
    
    plt.show()
    

    ブルーラインはベストフィットYラインₑ = 2.003 + 0.323 . XこのグラフからXとYの間に正の直線関係があることがわかります.私たちのモデルを使ってXの値からYを予測できます.
    たとえば、x = 10という値があれば、次のように予測できます.
    Yₑ = 2.003 + 0.323 ( 10 ) = 5.233

    状態モデルによる線形回帰


    我々は、ゼロから線形回帰モデルを実装する方法を学びましたols メソッドstatsmodels 図書館.
    この方法を実証するために、我々は非常に人気があるadvertising さまざまな媒体によって広告に関する様々なコストと特定の製品の販売に関するデータセット.このデータセットをダウンロードできますhere .
    我々は、見ているだけですTV この例で変数 — テレビ広告費が製品の販売数を予測できるかどうか調査します.このCSVファイルをpandas データフレームread_csv() :
    # Import and display first five rows of advertising dataset
    advert = pd.read_csv('advertising.csv')
    advert.head()
    

    まず、我々statsmodelsols 単純な線形回帰モデルを初期化する関数.これは式をとるy ~ X , どこX 予測変数TV 広告費y が出力変数Sales ). それから、我々は、olsfit() メソッド.
    import statsmodels.formula.api as smf
    
    # Initialise and fit linear regression model using `statsmodels`
    model = smf.ols('Sales ~ TV', data=advert)
    model = model.fit()
    
    我々はもう計算しなければならないalpha and beta このメソッドとして私たち自身が自動的にそれを行います!呼び出しmodel.params モデルのパラメータを表示します.
    Out:
    Intercept    7.032594
    TV           0.047537
    dtype: float64
    
    使用されている表記法ではαはインターセプトであり,βは斜面である.
    したがって、モデルの式は次のようになります.
    平易な英語で、これは平均的に、我々がテレビ広告に100ドルを費やすならば、我々は11.73台を売ると思っていなければなりません.
    我々は単純回帰モデルに適合したので、我々は.predict メソッド.
    また、プロットによる回帰モデルを視覚化することもできるsales_pred テレビ広告費に対して、最高の合うものの線を見つけるために:
    # Predict values
    sales_pred = model.predict()
    
    # Plot regression against actual data
    plt.figure(figsize=(12, 6))
    plt.plot(advert['TV'], advert['Sales'], 'o')           # scatter plot showing actual data
    plt.plot(advert['TV'], sales_pred, 'r', linewidth=2)   # regression line
    plt.xlabel('TV Advertising Costs')
    plt.ylabel('Sales')
    plt.title('TV vs Sales')
    
    plt.show()
    

    テレビ広告費と販売の間には正の直線関係があることがわかる — 言い換えると、テレビ広告により多くを費やすことは、より高い数の販売を予測します!
    このモデルで、我々はテレビ広告に費やされるどんな量からでも販売を予測することができます.例えば、テレビ広告費を400ドルに増やすと、売上は26台に増えると予測できる.
    new_X = 400
    model.predict({"TV": new_X})
    
    Out:
    0    26.04725
    dtype: float64
    

    SciKit学習による線形回帰


    我々は、線形回帰モデルをstatsmodels …さあ、使ってみましょうscikit-learn !
    このモデルのために、我々は続けますadvertising データセットが、今回は2つの予測変数を使用して、複数の線形回帰モデルを作成します.これは単に複数の予測子を持つ線形回帰モデルであり、
    Yₑ = α+β₁X₁ + β₂X₂ + … + βpxp,pは予測数の数である.
    我々の例では、我々は予測されますSales 変数の使用TV and Radio すなわち、私たちのモデルは次のように書くことができます.
    販売=α+β₁*TV+β₂*ラジオ
    まず、線形回帰モデルを初期化し、モデルを予測変数と出力変数に合わせます.
    from sklearn.linear_model import LinearRegression
    
    # Build linear regression model using TV and Radio as predictors
    # Split data into predictors X and output Y
    predictors = ['TV', 'Radio']
    X = advert[predictors]
    y = advert['Sales']
    
    # Initialise and fit model
    lm = LinearRegression()
    model = lm.fit(X, y)
    
    再び、値を計算する必要はありませんalpha and betas 我々-我々は、ちょうど電話しなければなりません.intercept_ for alpha , and .coef_ 係数を持つ配列に対してbeta1 and beta2 :
    print(f'alpha = {model.intercept_}')
    print(f'betas = {model.coef_}')
    
    Out:
    alpha = 2.921099912405138
    betas = [0.04575482 0.18799423]
    
    したがって、私たちのモデルは次のように書くことができます.
    販売= 2.921 + 0.046 *テレビ+ 0.1880 *ラジオ.
    我々は、単に使用して値を予測することができます.predict() :
    model.predict(X)
    
    Out:
    array([20.555464, 12.345362, 12.337017, 17.617115, 13.223908,
           12.512084, 11.718212, 12.105515,  3.709379, 12.551696,
           ...
           12.454977,  8.405926,  4.478859, 18.448760, 16.4631902,
            5.364512,  8.152375, 12.768048, 23.792922, 15.15754285])
    
    我々は我々のデータに複数の線形回帰モデルに適合した今、我々はテレビやラジオ広告費の任意の組み合わせから販売を予測することができます!例えば、もし我々がテレビ広告で300ドルとラジオ広告で200ドルを投資したならば、我々がどれくらいの販売をするかについてわかっていたいならば.
    new_X = [[300, 200]]
    print(model.predict(new_X))
    
    Out:
    [54.24638977]
    
    これは、我々がテレビ広告に300ドルとラジオ広告で200ドルを費やすならば、我々は平均的に、54台が売られるのを見なければならないということを意味します.
    私はあなたが線形回帰の基礎について、この簡単なチュートリアルを楽しんだことを願って!
    我々は、ゼロから線形回帰を実装し、使用してstatsmodels and scikit-learn Pythonで.実際には、モデルの有効性を測定する方法と有効性を測定する方法を知っている必要がありますどのようにモデルの重要な変数を選択するには、どのようにカテゴリ変数を処理するために、どのように非線形変換を実行する方法.

    我々は、すべてのこれらのトピックをカバーするフルコースを持っているここでは、次のXYZでは、Pythonとの線形回帰についての詳細について学ぶことに興味がある!