pyhton機械学習とデータマイニング-線形回帰

说明:
    此类文,只介绍常见机器学习的算法的实际应用,不对各算法原理做进一步理解,以后的机器学习的原理学习专在机器学习栏目进行展示,先学会怎么用吧,原理得慢慢来。
参考内容:
    python数据挖掘与机器学习实战.方魏.机械工业出版社.2019.05
    机器学习基础:从入门到求职.胡欢武.电子工业出版社.2019.03

回帰分析は、非常に広く使用されている定量分析方法です。これは、物事間の統計的関係を分析し、変数間の量的変化の法則の調査に焦点を当て、この関係を回帰方程式の形で記述して反映することで、1つ以上の変数による変数の影響度を正確に把握するのに役立ちます、そして予測の科学的根拠を提供します。在大数据分析中,回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。这种技术通常用于预测分析、时间序列模型,以及发现变量之间的因果关系。

単項線形回帰分析

線形回帰の概念

線形回帰分析では、独立変数が1つと従属変数が1つしかなく、関係が直線で大まかに表現できる場合、単純線形回帰分析と呼ばれます。従属変数Yと独立変数Xの間に高い正の相関関係が見つかれば、すべてのデータポイントが近似された直線にできるだけ近づくように直線方程式を決定できます。単純な線形回帰分析のモデルは、次の方程式で表すことができます。Y=a+bx 其中,Y为因变量,a为截距,b为相关系数,x为自变量。

線形回帰の例

住宅価格の予測:線形回帰の簡単な例は、住宅価値予測の問題です。一般的に言えば、家が大きければ大きいほど、家の価値は高くなります。家の価値は家の面積に関連していると結論付けることができます。この場合、住宅面積は独立変数であり、住宅価格は従属変数です。したがって、住宅価格を予測するには、与えられたデータセットからY = a + bxモデルに一致する線形方程式を見つける必要があります

予測される住宅地データセット
# predict_house_price.py

# 1. 导入需要的包
from sklearn import datasets, linear_model
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 2. 读取数据函数
def get_data(file_name):
    data = pd.read_csv(file_name)
    x_parmeter = []
    y_parmeter = []
    for single_square_feet, single_price_value in zip(data['square_feet'],data['price']):
        # 遍历数据
        x_parmeter.append([float(single_square_feet)])
        y_parmeter.append([float(single_price_value)])
    return x_parmeter, y_parmeter

# 3. 将数据拟合到线性模型
def linear_model_main(X_parameters,Y_parmeters,predict_value):
    regr = linear_model.LinearRegression()
    regr.fit(X_parameters,Y_parmeters)
    # 训练模型
    predict_outcome = regr.predict(predict_value)
    predictions = {}
    predictions['intercept'] = regr.intercept_
    predictions['coefficient'] = regr.coef_
    predictions['predicted_value'] = predict_outcome
    return predictions

# 4. 绘制拟合曲线
def show_linear_line(X,Y):
    regr = linear_model.LinearRegression()
    regr.fit(X,Y)
    plt.scatter(X,Y,color='blue')
    plt.plot(X,regr.predict(X),color="red")
    plt.xticks()
    plt.yticks()
    plt.show()
    
# 读取数据、进行预测
X, Y = get_data('E:/Data/6/input_data.csv')
show_linear_line(X,Y)
predictvalue = 700
result = linear_model_main(X,Y,predictvalue)
print("系数a:", result['intercept'])
print("系数b:", result['coefficient'])
print("预测价格:", result['predicted_value'])

系数a: [1771.80851064]
系数b: [[28.77659574]]
预测价格: [[21915.42553191]]

切片値はaの値で、係数値はbの値です。予測価格の値は21915.4255です。これは、家の価格を予測する作業が完了したことを意味します。データが線形回帰に適合するかどうかを確認するには、関数を記述し、X_parametersとY_parametersを入力し、データフィッティング用の直線を描く必要があります。図から、直線は基本的にすべてのデータポイントに適合できることがわかります。

多重線形回帰分析

多重線形回帰の概念

多重線形回帰分析は、単純な線形回帰分析の一般化です。これは、複数の独立変数に対する複数の従属変数の回帰分析を指します。最も一般的に使用されるのは1つの従属変数に制限されていますが、複数の独立変数があり、これは重回帰分析とも呼ばれます。重回帰分析の一般的な形式は次のとおりです。Y= a + b 1 X 1 + b 2 X 2 + b 3 X 3 +…+ b k X k(aは切片を表しますb 1、b 2、b 3 … b kは回帰係数です。)

線形回帰の例

広告投資:結果の値に影響を与える複数の要因がある場合、複数の線形回帰モデルを使用できます。たとえば、商品の販売は、テレビ広告、ラジオ広告、および新聞広告に関連している場合があります。従って:
販売β= 0 +β- 1 TV +β- 2ラジオベータ] + 3。新聞 

1.データを読み込む

from sklearn import linear_model
import pandas

# 1.读入数据
data = pd.read_csv("E:/Data/6/Advertising.csv",header=0,index_col=0)
data 
テレビ 無線 新聞 売上高
1 230.1 37.8 69.2 22.1
2 44.5 39.3 45.1 10.4
17.2 45.9 69.3 9.3
4 151.5 41.3 58.5 18.5
5 180.8 10.8 58.4 12.9
... ... ... ... ...
196 38.2 3.7 13.8 7.6
197 94.2 4.9 8.1 9.7
198 177.0 9.3 6.4 12.8
199 283.6 42.0 66.2 25.5
200 232.1 8.6 8.7 13.4

200行×4列

上記のデータには次の特性があります。

  • テレビ:テレビに投資された広告費(数百万元)。
  • ラジオ:放送メディアに投資された広告費。
  • 新聞:新聞メディアの広告費。
  • 販売:対応する製品の販売量。
    この場合、製品の販売はさまざまな広告投資を通じて予測されます。対応する変数は連続値であるため、この問題は回帰問題です。データセットには合計200の観測値があり、観測値の各グループは市場の状況に対応しています。

2.データ間の関係を表示する

# 2. 通过可视化各个特征和观测值的关系
import matplotlib.pyplot as plt
import seaborn as sns

sns.pairplot(data, x_vars=['TV','Radio','Newspaper'],y_vars=['Sales'],size=7,kind='reg')
plt.show()

この図から、TVの特性と売上には強い線形関係があり、ラジオと売上には弱い線形関係があり、新聞と売上には弱い線形関係があることがわかります。

3.特徴ベクトルとラベルを作成する

# 3. 使用pandas构建X(特征向量)和y(标签)
'''
scikit-learn要求X是一个特征矩阵,y是一个NumPy向量。pandas构建在NumPy之上。
因此,X可以是pandas的DataFrame,y可以是pandas的Series,scikit-learn可以理解这种结构。
'''

# 创建特征列表
feature_cols = ['TV','Radio','Newspaper']

# 使用列表选择原始DataFrame的子集,构建特征向量
X = data[feature_cols]
X = data[['TV','Radio','Newspaper']]

# 从DataFrame中选择一个Series
y = data['Sales']
y = data.Sales

X
テレビ 無線 新聞
1 230.1 37.8 69.2
2 44.5 39.3 45.1
17.2 45.9 69.3
4 151.5 41.3 58.5
5 180.8 10.8 58.4
... ... ... ...
196 38.2 3.7 13.8
197 94.2 4.9 8.1
198 177.0 9.3 6.4
199 283.6 42.0 66.2
200 232.1 8.6 8.7

200行×3列

y
1      22.1
2      10.4
3       9.3
4      18.5
5      12.9
       ... 
196     7.6
197     9.7
198    12.8
199    25.5
200    13.4
Name: Sales, Length: 200, dtype: float64

4.トレーニングセットとテストセットのビルドトレーニングセットとテストセットを
ビルドし、それぞれX_train、y_train、Xtest、y_testに保存します。

# 4.构建训练集和测试集
# 使用交叉验证
from sklearn.cross_validation import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y) # 75% 用于训练 25%用于测试
print(X_train.shape)
print(y_train.shape)

print(X_test.shape)
print(y_test.shape)
(150, 3)
(150,)
(50, 3)
(50,)

5.モデルのトレーニング
線形学習にsklearn 使用するには、まず関連する線形回帰モデルをインポートしてから、線形回帰シミュレーションを実行します。

from sklearn.linear_model import LinearRegression

linreg = LinearRegression()
# 训练模型
model = linreg.fit(X_train,y_train)
print(model)
print(linreg.intercept_) # 截距
print(linreg.coef_)      # 系数
 
# 将特征名称和系数对应
zip(feature_cols,linreg.coef_) 

LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
3.18324257719733
[0.04355291 0.19015449 0.00187221]
1

<zip at 0x1fcd01a5788>

ラジオと新聞に与えられた広告投資の場合、追加の各ユニットがテレビ広告に投資されると、対応する販売量は0.04355ユニット増加します。つまり、他の2つのメディアの広告投資は固定されており、テレビ広告が1,000ドル追加されるごとに(ユニットが1,000ドルであるため)、売上は43.5増加します(ユニットが1000であるため)。同様に、制御変数法を使用して、他の2つの変数を分析できます。

6.予測
を行う線形シミュレーションによって回帰モデルを取得した後、モデルによってデータを予測し、予測関数によって予測結果を取得できます。

y_pred = linreg.predict(X_test)
print(y_pred)

# 返回模型在测试集上的预测准确率
print("模型得分:",linreg.score(X_test,y_test))

[10.74391068 23.14564258  8.32679708 15.21951218 18.28945003 14.87833614
 13.7803107   7.63132692  8.92202965 11.01760334 12.53937187 14.68253695
 15.55290183 11.01469897 11.76553368 17.74441368 16.85875042  9.38817803
 20.61167465  4.771148   10.76013573 18.12281809 17.31568335 15.00207018
 16.24914813  8.14154239 18.41459647 21.86644162 21.18666811 16.48384668
 24.61985703 21.02422026 11.4813219  20.97928742 13.30921663  7.2209075
 15.33535201  7.60112899 12.52375857 16.99771224 12.79018816 11.62956032
 20.72425247 17.31572264 11.89161417  6.34236115 20.1308101  10.79413639
 17.74580942  9.98156724]
模型得分: 0.8631218575476306

7.モデル評価
分類問題の場合、評価尺度は正解率ですが、回帰問題には適用できませんここでは、線形回帰によく使用される3つの評価尺度を示します。

  • 平均絶対誤差(MAE);
  • 平均二乗誤差(平均二乗誤差、MSE);
  • 二乗平均平方根誤差(RMSE)。
# 此处采用RMSE
from sklearn import metrics
import numpy as np

sum_mean = 0 
for i in range(len(y_pred)):
    sum_mean += (y_pred[i] - y_test.values[i])**2
    sum_error = np.sqrt(sum_mean / len(y_pred))
print("均方根为:", sum_error)
均方根为: 2.094615925156935
# 绘制预测和特测试集曲线
import matplotlib.pyplot as plt

def show_roc():   
    plt.figure()
    plt.plot(range(len(y_pred)), y_pred,'b',label = "predict")
    plt.plot(range(len(y_pred)), y_test,'r',label = "test")
    plt.legend(loc="upper right")
    plt.xlabel("The number of sales")
    plt.ylabel("Value of sales")
    plt.show()
    
show_roc()

まとめ

通常の線形回帰の導入は上記のとおりであり、linear_model.LinearRegressionクラスを介してscikit-learnに実装されています。以下に、このクラスの主なパラメーターとメソッドをまとめます。

  • パラメータ
    • fit_intercept:バイアス定数bを計算するかどうかを選択します。デフォルトはTrueで、これは計算を意味します。
    • 正規化:データをフィットする前に正規化するかどうかを選択します。デフォルトはFalseで、正規化は行われません。
    • n_jobs:コンピュータが並行して動作しているときのCPUコアの数を指定します。デフォルトは1です。-1を選択すると、使用可能なすべてのCPUコアが使用されることを意味します。
  • の属性
    • coef_:線形回帰モデルの出力に使用される重みベクトルw。
    • intercept_:線形回帰モデルのバイアス定数bを出力するために使用されます。
  • 方法
    • fit(X_train、y_train):トレーニングセット(X_train、y_train)でモデルをトレーニングします。
    • 予測(X):訓練されたモデルを使用して、予測されるデータセットXを予測します。返されるデータは、予測セットに対応する予測結果です。
    • スコア(X_test、y_test):テストセット(X_test、y_test)でのモデルの予測精度を返します。計算式は次のとおりです。スコアは1未満の値であるか、負の値の場合があります。値が大きいほど、モデルの予測パフォーマンスを示します良いです。

おすすめ

転載: www.cnblogs.com/sinlearn/p/12683168.html