<cite id="1ndtl"></cite>
<ruby id="1ndtl"></ruby>
<strike id="1ndtl"></strike>
<span id="1ndtl"><dl id="1ndtl"></dl></span><span id="1ndtl"><dl id="1ndtl"></dl></span>
<strike id="1ndtl"></strike>
<strike id="1ndtl"><dl id="1ndtl"><del id="1ndtl"></del></dl></strike>
<span id="1ndtl"></span>
<span id="1ndtl"><dl id="1ndtl"></dl></span>
<strike id="1ndtl"></strike>
<strike id="1ndtl"></strike><span id="1ndtl"><dl id="1ndtl"></dl></span>
<strike id="1ndtl"></strike><strike id="1ndtl"></strike>
<strike id="1ndtl"></strike>
<span id="1ndtl"></span>
<span id="1ndtl"><dl id="1ndtl"></dl></span>
<th id="1ndtl"><noframes id="1ndtl"><span id="1ndtl"><video id="1ndtl"><strike id="1ndtl"></strike></video></span> <strike id="1ndtl"></strike>
<strike id="1ndtl"></strike>
<span id="1ndtl"><dl id="1ndtl"></dl></span>
  1. 首頁
  2. 常見的算法有哪些(10種常見的回歸算法總結和介紹)

常見的算法有哪些(10種常見的回歸算法總結和介紹)

線性回歸是機器學習中最簡單的算法,它可以通過不同的方式進行訓練。 在本文中,我們將介紹以下回歸算法:線性回歸、Robust 回歸、Ridge 回歸、LASSO 回歸、Elastic Net、多項式回歸、多層感知機、隨機森林回歸和支持向量機。除此以外,本文還將介紹用于評估回歸模型的最常用指標,包括均方誤差 (MSE)、均方根誤差 (RMSE) 和平均絕對誤差 (MAE)。

導入庫和讀取數據

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsimport hvplot.pandas%matplotlib inlinesns.set_style("whitegrid")plt.style.use("fivethirtyeight")USAhousing = pd.read_csv('../usa-housing/USA_Housing.csv')USAhousing.head()

探索性數據分析 (EDA)

下一步將創建一些簡單的圖表來檢查數據。 進行EDA將幫助我們熟悉數據和獲得數據的信息,尤其是對回歸模型影響最大的異常值。

USAhousing.info()<class 'pandas.core.frame.DataFrame'>RangeIndex: 5000 entries, 0 to 4999Data columns (total 7 columns):# Column Non-Null Count Dtype --- ------ -------------- ----- 0 Avg. Area Income 5000 non-null float641 Avg. Area House Age 5000 non-null float642 Avg. Area Number of Rooms 5000 non-null float643 Avg. Area Number of Bedrooms 5000 non-null float644 Area Population 5000 non-null float645 Price 5000 non-null float646 Address 5000 non-null object dtypes: float64(6), object(1)memory usage: 273.6+ KB

查看數據集的描述

USAhousing.describe()

訓練前的準備

我們將從訓練一個線性回歸模型開始,訓練之前需要確定數據的特征和目標,訓練的特征的 X ,目標變量的 y ,在本例中我們的目標為 Price 列。

之后,將數據分成訓練集和測試集。 我們將在訓練集上訓練我們的模型,然后使用測試集來評估模型。

from sklearn.model_selection import train_test_splitX = USAhousing[['Avg. Area Income', 'Avg. Area House Age', 'Avg. Area Number of Rooms','Avg. Area Number of Bedrooms', 'Area Population']]y = USAhousing['Price']X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

為了評估回歸模型還創建了一些輔助函數。

from sklearn import metricsfrom sklearn.model_selection import cross_val_scoredef cross_val(model):pred = cross_val_score(model, X, y, cv=10)return pred.mean()def print_evaluate(true, predicted): mae = metrics.mean_absolute_error(true, predicted)mse = metrics.mean_squared_error(true, predicted)rmse = np.sqrt(metrics.mean_squared_error(true, predicted))r2_square = metrics.r2_score(true, predicted)print('MAE:', mae)print('MSE:', mse)print('RMSE:', rmse)print('R2 Square', r2_square)print('__________________________________')def evaluate(true, predicted):mae = metrics.mean_absolute_error(true, predicted)mse = metrics.mean_squared_error(true, predicted)rmse = np.sqrt(metrics.mean_squared_error(true, predicted))r2_square = metrics.r2_score(true, predicted)return mae, mse, rmse, r2_square

訓練回歸模型

對于線性回歸而言,一般都會有以下的假設:

線性假設:線性回歸假設輸入和輸出之間的關系是線性的。所以可能需要轉換數據以使關系線性化(例如,指數關系的對數轉換)。

去除噪音:線性回歸假設您的輸入和輸出變量沒有噪聲。這對于輸出變量最重要,如果可能希望刪除輸出變量 (y) 中的異常值。

去除共線性:當具有高度相關的輸入變量時,線性回歸將會過擬合。需要將輸入數據進行相關性計算并刪除最相關的。

高斯分布:如果輸入和輸出變量具有高斯分布,線性回歸將會做出更可靠的預測。對于分布的轉換可以對變量使用變換(例如 log 或 BoxCox)以使它們的分布看起來更像高斯分布。

對數據進行處理:使用標準化或歸一化重新調整輸入變量,線性回歸通常會做出更可靠的預測。

from sklearn.preprocessing import StandardScalerfrom sklearn.pipeline import Pipelinepipeline = Pipeline([('std_scalar', StandardScaler())])X_train = pipeline.fit_transform(X_train)X_test = pipeline.transform(X_test)

下面我們開始進行回歸回歸算法的示例

1、線性回歸和評價指標

from sklearn.linear_model import LinearRegressionlin_reg = LinearRegression(normalize=True)lin_reg.fit(X_train,y_train)

有了第一個模型,那么就要知道評價模型的指標,以下是回歸問題的三個常見評估指標:

平均絕對誤差 (MAE) 是誤差絕對值的平均值:

均方誤差 (MSE) 是均方誤差的平均值:

均方根誤差 (RMSE) 是均方誤差的平方根:

這三個指標中:

MAE 是最容易理解的,因為它是平均誤差。

MSE 比 MAE 更受歡迎,因為 MSE “懲罰”更大的錯誤,這在現實世界中往往很有用。

RMSE 比 MSE 更受歡迎,因為 RMSE 可以用“y”單位解釋

這些都是損失函數,我們的訓練目標就是最小化他們。

test_pred = lin_reg.predict(X_test)train_pred = lin_reg.predict(X_train)print('Test set evaluation:\n_____________________________________')print_evaluate(y_test, test_pred)print('Train set evaluation:\n_____________________________________')print_evaluate(y_train, train_pred)results_df = pd.DataFrame(data=[["Linear Regression", *evaluate(y_test, test_pred) , cross_val(LinearRegression())]], columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', "Cross Validation"])Test set evaluation:_____________________________________MAE: 81135.56609336878MSE: 10068422551.40088RMSE: 100341.52954485436R2 Square 0.9146818498754016__________________________________Train set evaluation:_____________________________________MAE: 81480.49973174892MSE: 10287043161.197224RMSE: 101425.06180031257R2 Square 0.9192986579075526__________________________________

2、Robust回歸

Robust回歸是一種回歸分析形式,它的目標是克服傳統參數和非參數方法的一些局限性,旨在不受基礎數據生成過程違反回歸假設的過度影響。

當數據包含異常值時,則會考慮Robust回歸。 在存在異常值的情況下,最小二乘估計效率低下并且可能存在偏差。 因為最小二乘預測被拖向離群值,并且因為估計的方差被人為夸大,結果是離群值可以被掩蓋了。

隨機樣本共識——RANSAC

隨機樣本共識 (RANSAC) 是一種迭代方法,它從一組觀察到的包含異常值的數據中估計數學模型的參數,而異常值不會對估計值產生影響。 因此它也可以理解為一種異常值檢測方法。

一個基本的假設是,數據由“內值”和“異常值”組成,“內值”即數據的分布可以用一組模型參數來解釋,但可能受噪聲影響,“異常值”是不符合模型的數據。RANSAC還假設,給定一組(通常很小)內點,存在一個程序可以估計模型的參數,以最優地解釋或擬合該數據。

from sklearn.linear_model import RANSACRegressormodel = RANSACRegressor(base_estimator=LinearRegression(), max_trials=100)model.fit(X_train, y_train)test_pred = model.predict(X_test)train_pred = model.predict(X_train)print('Test set evaluation:\n_____________________________________')print_evaluate(y_test, test_pred)print('====================================')print('Train set evaluation:\n_____________________________________')print_evaluate(y_train, train_pred)results_df_2 = pd.DataFrame(data=[["Robust Regression", *evaluate(y_test, test_pred) , cross_val(RANSACRegressor())]],columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', "Cross Validation"])results_df = results_df.append(results_df_2, ignore_index=True)Test set evaluation:_____________________________________MAE: 84645.31069259303MSE: 10996805871.555056RMSE: 104865.65630155115R2 Square 0.9068148829222649__________________________________====================================Train set evaluation:_____________________________________MAE: 84956.48056962446MSE: 11363196455.35414RMSE: 106598.29480509592R2 Square 0.9108562888249323_________________________________

3、Ridge回歸

Ridge回歸通過對系數的大小施加懲罰來解決普通最小二乘法的一些問題。 Ridge系數最小化懲罰殘差平方和

alpha >= 0 是控制收縮量的復雜性參數:alpha 值越大,收縮量越大,因此系數對共線性的魯棒性更強。

Ridge回歸是一個 L2 懲罰模型。 將權重的平方和添加到最小二乘成本函數。

from sklearn.linear_model import Ridgemodel = Ridge(alpha=100, solver='cholesky', tol=0.0001, random_state=42)model.fit(X_train, y_train)pred = model.predict(X_test)test_pred = model.predict(X_test)train_pred = model.predict(X_train)print('Test set evaluation:\n_____________________________________')print_evaluate(y_test, test_pred)print('====================================')print('Train set evaluation:\n_____________________________________')print_evaluate(y_train, train_pred)results_df_2 = pd.DataFrame(data=[["Ridge Regression", *evaluate(y_test, test_pred) , cross_val(Ridge())]],columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', "Cross Validation"])results_df = results_df.append(results_df_2, ignore_index=True)Test set evaluation:_____________________________________MAE: 81428.64835535336MSE: 10153269900.892609RMSE: 100763.43533689494R2 Square 0.9139628674464607__________________________________====================================Train set evaluation:_____________________________________MAE: 81972.39058585509MSE: 10382929615.14346RMSE: 101896.66145239233R2 Square 0.9185464334441484__________________________________

4、LASSO 回歸

LASSO 回歸是一種估計稀疏系數的線性模型。 在數學上,它由一個用 L1 先驗作為正則化器訓練的線性模型組成。 最小化的目標函數是:

from sklearn.linear_model import Lassomodel = Lasso(alpha=0.1, precompute=True, # warm_start=True, positive=True, selection='random',random_state=42)model.fit(X_train, y_train)test_pred = model.predict(X_test)train_pred = model.predict(X_train)print('Test set evaluation:\n_____________________________________')print_evaluate(y_test, test_pred)print('====================================')print('Train set evaluation:\n_____________________________________')print_evaluate(y_train, train_pred)results_df_2 = pd.DataFrame(data=[["Lasso Regression", *evaluate(y_test, test_pred) , cross_val(Lasso())]], columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', "Cross Validation"])results_df = results_df.append(results_df_2, ignore_index=True)Test set evaluation:_____________________________________MAE: 81135.6985172622MSE: 10068453390.364521RMSE: 100341.68321472648R2 Square 0.914681588551116__________________________________====================================Train set evaluation:_____________________________________MAE: 81480.63002185506MSE: 10287043196.634295RMSE: 101425.0619750084R2 Square 0.9192986576295505__________________________________

5、Elastic Net

Elastic Net 使用 L1 和 L2 先驗作為正則化器進行訓練。 這種組合允許學習一個稀疏模型,其中很少有像 Lasso 那樣的非零權重,同時仍然保持 Ridge 的正則化屬性。

當多個特征相互關聯時,Elastic Net絡很有用。 Lasso 可能會隨機選擇關聯特征其中之一,而 Elastic Net 可能會同時選擇兩者。 Elastic Net最小化的目標函數是:

from sklearn.linear_model import ElasticNetmodel = ElasticNet(alpha=0.1, l1_ratio=0.9, selection='random', random_state=42)model.fit(X_train, y_train)test_pred = model.predict(X_test)train_pred = model.predict(X_train)print('Test set evaluation:\n_____________________________________')print_evaluate(y_test, test_pred)print('====================================')print('Train set evaluation:\n_____________________________________')print_evaluate(y_train, train_pred)results_df_2 = pd.DataFrame(data=[["Elastic Net Regression", *evaluate(y_test, test_pred) , cross_val(ElasticNet())]], columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', "Cross Validation"])results_df = results_df.append(results_df_2, ignore_index=True)Test set evaluation:_____________________________________MAE: 81184.43147330945MSE: 10078050168.470106RMSE: 100389.49232100991R2 Square 0.9146002670381437__________________________________====================================Train set evaluation:_____________________________________MAE: 81577.88831531754MSE: 10299274948.101461RMSE: 101485.34351373829R2 Square 0.9192027001474953__________________________________

6、多項式回歸

機器學習中的一種常見模式是使用在數據的非線性函數上訓練的線性模型。 這種方法保持了線性方法通常快速的性能,同時允許它們適應更廣泛的數據。

可以通過從系數構造多項式特征來擴展簡單的線性回歸。 在標準線性回歸中,可能有一個看起來像這樣的二維數據模型:

如果我們想對數據擬合拋物面而不是平面,我們可以將特征組合成二階多項式,使模型看起來像這樣:

這仍然是一個線性模型:那么如果我們創建一個新的變量

通過重新標記數據,那么公式可以寫成

可以看到到生成的多項式回歸屬于上面的同一類線性模型(即模型在 w 中是線性的),并且可以通過相同的技術求解。 通過考慮使用這些基函數構建的高維空間內的線性擬合,該模型可以靈活地擬合更廣泛的數據范圍。

from sklearn.preprocessing import PolynomialFeaturespoly_reg = PolynomialFeatures(degree=2)X_train_2_d = poly_reg.fit_transform(X_train)X_test_2_d = poly_reg.transform(X_test)lin_reg = LinearRegression(normalize=True)lin_reg.fit(X_train_2_d,y_train)test_pred = lin_reg.predict(X_test_2_d)train_pred = lin_reg.predict(X_train_2_d)print('Test set evaluation:\n_____________________________________')print_evaluate(y_test, test_pred)print('====================================')print('Train set evaluation:\n_____________________________________')print_evaluate(y_train, train_pred)results_df_2 = pd.DataFrame(data=[["Polynomail Regression", *evaluate(y_test, test_pred), 0]], columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', 'Cross Validation'])results_df = results_df.append(results_df_2, ignore_index=True)Test set evaluation:_____________________________________MAE: 81174.51844119698MSE: 10081983997.620703RMSE: 100409.0832426066R2 Square 0.9145669324195059__________________________________====================================Train set evaluation:_____________________________________MAE: 81363.0618562117MSE: 10266487151.007816RMSE: 101323.67517519198R2 Square 0.9194599187853729__________________________________

7、隨機梯度下降

梯度下降是一種非常通用的優化算法,能夠為各種問題找到最佳解決方案。 梯度下降的一般思想是迭代地調整參數以最小化成本函數。 梯度下降測量誤差函數相對于參數向量的局部梯度,它沿著梯度下降的方向前進。 一旦梯度為零,就達到了最小值。

from sklearn.linear_model import SGDRegressorsgd_reg = SGDRegressor(n_iter_no_change=250, penalty=None, eta0=0.0001, max_iter=100000)sgd_reg.fit(X_train, y_train)test_pred = sgd_reg.predict(X_test)train_pred = sgd_reg.predict(X_train)print('Test set evaluation:\n_____________________________________')print_evaluate(y_test, test_pred)print('====================================')print('Train set evaluation:\n_____________________________________')print_evaluate(y_train, train_pred)results_df_2 = pd.DataFrame(data=[["Stochastic Gradient Descent", *evaluate(y_test, test_pred), 0]],columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', 'Cross Validation'])results_df = results_df.append(results_df_2, ignore_index=True)Test set evaluation:_____________________________________MAE: 81135.56682170597MSE: 10068422777.172981RMSE: 100341.53066987259R2 Square 0.914681847962246__________________________________====================================Train set evaluation:_____________________________________MAE: 81480.49901528798MSE: 10287043161.228634RMSE: 101425.06180046742R2 Square 0.9192986579073061__________________________________

8、多層感知機

多層感知機相對于簡單回歸任務的好處是簡單的線性回歸模型只能學習特征和目標之間的線性關系,因此無法學習復雜的非線性關系。 由于每一層都存在激活函數,多層感知機有能力學習特征和目標之間的復雜關系。

from tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Input, Dense, Activation, Dropoutfrom tensorflow.keras.optimizers import AdamX_train = np.array(X_train)X_test = np.array(X_test)y_train = np.array(y_train)y_test = np.array(y_test)model = Sequential()model.add(Dense(X_train.shape[1], activation='relu'))model.add(Dense(32, activation='relu'))# model.add(Dropout(0.2))model.add(Dense(64, activation='relu'))# model.add(Dropout(0.2))model.add(Dense(128, activation='relu'))# model.add(Dropout(0.2))model.add(Dense(512, activation='relu'))model.add(Dropout(0.1))model.add(Dense(1))model.compile(optimizer=Adam(0.00001), loss='mse')r = model.fit(X_train, y_train,validation_data=(X_test,y_test),batch_size=1,epochs=100)pd.DataFrame({'True Values': y_test, 'Predicted Values': pred}).hvplot.scatter(x='True Values', y='Predicted Values')pd.DataFrame(r.history)

pd.DataFrame(r.history).hvplot.line(y=['loss', 'val_loss'])

test_pred = model.predict(X_test)train_pred = model.predict(X_train)print('Test set evaluation:\n_____________________________________')print_evaluate(y_test, test_pred)print('Train set evaluation:\n_____________________________________')print_evaluate(y_train, train_pred)results_df_2 = pd.DataFrame(data=[["Artficial Neural Network", *evaluate(y_test, test_pred), 0]], columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', 'Cross Validation'])results_df = results_df.append(results_df_2, ignore_index=True)Test set evaluation:_____________________________________MAE: 101035.09313018023MSE: 16331712517.46175RMSE: 127795.58880282899R2 Square 0.8616077649459881__________________________________Train set evaluation:_____________________________________MAE: 102671.5714851714MSE: 17107402549.511665RMSE: 130795.2695991398R2 Square 0.8657932776379376__________________________________

9、隨機森林回歸

from sklearn.ensemble import RandomForestRegressorrf_reg = RandomForestRegressor(n_estimators=1000)rf_reg.fit(X_train, y_train)test_pred = rf_reg.predict(X_test)train_pred = rf_reg.predict(X_train)print('Test set evaluation:\n_____________________________________')print_evaluate(y_test, test_pred)print('Train set evaluation:\n_____________________________________')print_evaluate(y_train, train_pred)results_df_2 = pd.DataFrame(data=[["Random Forest Regressor", *evaluate(y_test, test_pred), 0]], columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', 'Cross Validation'])results_df = results_df.append(results_df_2, ignore_index=True)Test set evaluation:_____________________________________MAE: 94032.15903928125MSE: 14073007326.955029RMSE: 118629.70676417871R2 Square 0.8807476597554337__________________________________Train set evaluation:_____________________________________MAE: 35289.68268023927MSE: 1979246136.9966476RMSE: 44488.71921056671R2 Square 0.9844729124701823__________________________________

10、支持向量機

from sklearn.svm import SVRsvm_reg = SVR(kernel='rbf', C=1000000, epsilon=0.001)svm_reg.fit(X_train, y_train)test_pred = svm_reg.predict(X_test)train_pred = svm_reg.predict(X_train)print('Test set evaluation:\n_____________________________________')print_evaluate(y_test, test_pred)print('Train set evaluation:\n_____________________________________')print_evaluate(y_train, train_pred)results_df_2 = pd.DataFrame(data=[["SVM Regressor", *evaluate(y_test, test_pred), 0]], columns=['Model', 'MAE', 'MSE', 'RMSE', 'R2 Square', 'Cross Validation'])results_df = results_df.append(results_df_2, ignore_index=True)Test set evaluation:_____________________________________MAE: 87205.73051021634MSE: 11720932765.275513RMSE: 108263.25676458987R2 Square 0.9006787511983232__________________________________Train set evaluation:_____________________________________MAE: 73692.5684807321MSE: 9363827731.411337RMSE: 96766.87310960986R2 Square 0.9265412370487783__________________________________

結果對比

以上就是我們常見的10個回歸算法,下面看看結果的對比

results_df
results_df.set_index('Model', inplace=True)results_df['R2 Square'].plot(kind='barh', figsize=(12, 8))

可以看到,雖然本例的差別很小(這是因為數據集的原因),但是每個算法還是有細微的差別的,我們可以根據不同的實際情況選擇表現較好的算法。

總結

在本文中,我們介紹了機器學習中的常見的線性回歸算法包括:

常見的線性回歸模型(Ridge、Lasso、ElasticNet……)

模型使用的方法

采用學習算法對模型中的系數進行估計

如何評估線性回歸模型

作者:Fares Sayah

相關文章
美女网站色