<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 如何利用Python從頭開始隨機梯度下降實現線性回歸 > 原文: [https://machinelearningmastery.com/implement-linear-regression-stochastic-gradient-descent-scratch-python/](https://machinelearningmastery.com/implement-linear-regression-stochastic-gradient-descent-scratch-python/) 許多機器學習算法的核心是優化。 機器學習算法使用優化算法在給定訓練數據集的情況下找到一組好的模型參數。 機器學習中最常用的優化算法是隨機梯度下降。 在本教程中,您將了解如何實現隨機梯度下降,以便從頭開始使用Python優化線性回歸算法。 完成本教程后,您將了解: * 如何使用隨機梯度下降估計線性回歸系數。 * 如何預測多元線性回歸。 * 如何利用隨機梯度下降實現線性回歸來預測新數據。 讓我們開始吧。 * **2017年1月更新**:將cross_validation_split()中的fold_size計算更改為始終為整數。修復了Python 3的問題。 * **更新Aug / 2018** :經過測試和更新,可與Python 3.6配合使用。 ![How to Implement Linear Regression With Stochastic Gradient Descent From Scratch With Python](img/bed6bc92622a00f766eb37d7fd8d9439.jpg) 如何使用Python隨機梯度下降進行線性回歸 照片 [star5112](https://www.flickr.com/photos/johnjoh/6981384675/) ,保留一些權利。 ## 描述 在本節中,我們將描述線性回歸,隨機梯度下降技術和本教程中使用的葡萄酒質量數據集。 ### 多元線性回歸 線性回歸是一種預測實際價值的技術。 令人困惑的是,這些預測真實價值的問題被稱為回歸問題。 線性回歸是一種使用直線來模擬輸入和輸出值之間關系的技術。在兩個以上的維度中,該直線可以被認為是平面或超平面。 預測作為輸入值的組合來預測輸出值。 使用系數(b)對每個輸入屬性(x)進行加權,并且學習算法的目標是發現導致良好預測(y)的一組系數。 ```py y = b0 + b1 * x1 + b2 * x2 + ... ``` 使用隨機梯度下降可以找到系數。 ### 隨機梯度下降 梯度下降是通過遵循成本函數的梯度來最小化函數的過程。 這包括了解成本的形式以及衍生物,以便從給定的點知道梯度并且可以在該方向上移動,例如,向下走向最小值。 在機器學習中,我們可以使用一種技術來評估和更新稱為隨機梯度下降的每次迭代的系數,以最小化模型對我們的訓練數據的誤差。 此優化算法的工作方式是每個訓練實例一次顯示給模型一個。該模型對訓練實例進行預測,計算誤差并更新模型以減少下一次預測的誤差。該過程重復固定次數的迭代。 該過程可用于在模型中找到導致訓練數據上模型的最小誤差的系數集。每次迭代,機器學習語言中的系數(b)使用以下等式更新: ```py b = b - learning_rate * error * x ``` 其中 **b** 是被優化的系數或權重, **learning_rate** 是您必須配置的學習率(例如0.01),**錯誤**是模型的預測誤差關于歸因于重量的訓練數據, **x** 是輸入值。 ### 葡萄酒質量數據集 在我們開發具有隨機梯度下降的線性回歸算法之后,我們將使用它來模擬葡萄酒質量數據集。 該數據集由4,898種白葡萄酒的細節組成,包括酸度和pH值等測量值。目標是使用這些客觀測量來預測0到10之間的葡萄酒質量。 以下是此數據集中前5個記錄的示例。 ```py 7,0.27,0.36,20.7,0.045,45,170,1.001,3,0.45,8.8,6 6.3,0.3,0.34,1.6,0.049,14,132,0.994,3.3,0.49,9.5,6 8.1,0.28,0.4,6.9,0.05,30,97,0.9951,3.26,0.44,10.1,6 7.2,0.23,0.32,8.5,0.058,47,186,0.9956,3.19,0.4,9.9,6 7.2,0.23,0.32,8.5,0.058,47,186,0.9956,3.19,0.4,9.9,6 ``` 必須將數據集標準化為0到1之間的值,因為每個屬性具有不同的單位,并且反過來具有不同的比例。 通過預測歸一化數據集上的平均值(零規則算法),可以實現0.148的基線均方根誤差(RMSE)。 您可以在 [UCI機器學習庫](http://archive.ics.uci.edu/ml/datasets/Wine+Quality)上了解有關數據集的更多信息。 您可以下載數據集并將其保存在當前工作目錄中,名稱為 **winequality-white.csv** 。您必須從文件的開頭刪除標頭信息,并將“;”值分隔符轉換為“,”以符合CSV格式。 ## 教程 本教程分為3個部分: 1. 做出預測。 2. 估計系數。 3. 葡萄酒質量預測。 這將為您自己的預測建模問題提供實施和應用具有隨機梯度下降的線性回歸所需的基礎。 ### 1.做出預測 第一步是開發一個可以進行預測的功能。 在隨機梯度下降中的候選系數值的評估中以及在模型完成之后,我們希望開始對測試數據或新數據進行預測。 下面是一個名為 **predict()**的函數,它預測給定一組系數的行的輸出值。 第一個系數in總是截距,也稱為偏差或b0,因為它是獨立的,不負責特定的輸入值。 ```py # Make a prediction with coefficients def predict(row, coefficients): yhat = coefficients[0] for i in range(len(row)-1): yhat += coefficients[i + 1] * row[i] return yhat ``` 我們可以設計一個小數據集來測試我們的預測函數。 ```py x, y 1, 1 2, 3 4, 3 3, 2 5, 5 ``` 下面是該數據集的圖表。 ![Small Contrived Dataset For Simple Linear Regression](img/e644f57958bd1d11e6f2b3211166ea1c.jpg) 線性回歸的小受控數據集 我們還可以使用先前準備的系數來對該數據集進行預測。 綜合這些,我們可以測試下面的 **predict()**函數。 ```py # Make a prediction with coefficients def predict(row, coefficients): yhat = coefficients[0] for i in range(len(row)-1): yhat += coefficients[i + 1] * row[i] return yhat dataset = [[1, 1], [2, 3], [4, 3], [3, 2], [5, 5]] coef = [0.4, 0.8] for row in dataset: yhat = predict(row, coef) print("Expected=%.3f, Predicted=%.3f" % (row[-1], yhat)) ``` 有一個輸入值(x)和兩個系數值(b0和b1)。我們為這個問題建模的預測方程是: ```py y = b0 + b1 * x ``` 或者,我們手動選擇的具體系數值為: ```py y = 0.4 + 0.8 * x ``` 運行此函數,我們得到的結果與預期的輸出(y)值相當接近。 ```py Expected=1.000, Predicted=1.200 Expected=3.000, Predicted=2.000 Expected=3.000, Predicted=3.600 Expected=2.000, Predicted=2.800 Expected=5.000, Predicted=4.400 ``` 現在我們準備實施隨機梯度下降來優化我們的系數值。 ### 2.估計系數 我們可以使用隨機梯度下降來估計訓練數據的系數值。 隨機梯度下降需要兩個參數: * **學習率**:用于限制每次更新時每個系數的校正量。 * **時期**:更新系數時運行訓練數據的次數。 這些以及訓練數據將是該函數的參數。 我們需要在函數中執行3個循環: 1. 循環每個時代。 2. 循環遍歷訓練數據中的每一行以獲得一個迭代。 3. 循環遍歷每個系數并將其更新為一個迭代中的一行。 如您所見,我們更新訓練數據中每一行的每個系數,每個時期。 系數根據模型產生的誤差進行更新。該誤差被計算為用候選系數進行的預測與預期輸出值之間的差異。 ```py error = prediction - expected ``` 有一個系數可以對每個輸入屬性進行加權,并且這些系數以一致的方式更新,例如: ```py b1(t+1) = b1(t) - learning_rate * error(t) * x1(t) ``` 列表開頭的特殊系數(也稱為截距或偏差)以類似的方式更新,除非沒有輸入,因為它與特定輸入值無關: ```py b0(t+1) = b0(t) - learning_rate * error(t) ``` 現在我們可以將所有這些放在一起。下面是一個名為 **coefficients_sgd()**的函數,它使用隨機梯度下降計算訓練數據集的系數值。 ```py # Estimate linear regression coefficients using stochastic gradient descent def coefficients_sgd(train, l_rate, n_epoch): coef = [0.0 for i in range(len(train[0]))] for epoch in range(n_epoch): sum_error = 0 for row in train: yhat = predict(row, coef) error = yhat - row[-1] sum_error += error**2 coef[0] = coef[0] - l_rate * error for i in range(len(row)-1): coef[i + 1] = coef[i + 1] - l_rate * error * row[i] print('>epoch=%d, lrate=%.3f, error=%.3f' % (epoch, l_rate, sum_error)) return coef ``` 您可以看到,此外,我們會跟蹤每個時期的平方誤差(正值)的總和,以便我們可以在外部循環中打印出一條好消息。 我們可以在上面的同樣小的人為數據集上測試這個函數。 ```py # Make a prediction with coefficients def predict(row, coefficients): yhat = coefficients[0] for i in range(len(row)-1): yhat += coefficients[i + 1] * row[i] return yhat # Estimate linear regression coefficients using stochastic gradient descent def coefficients_sgd(train, l_rate, n_epoch): coef = [0.0 for i in range(len(train[0]))] for epoch in range(n_epoch): sum_error = 0 for row in train: yhat = predict(row, coef) error = yhat - row[-1] sum_error += error**2 coef[0] = coef[0] - l_rate * error for i in range(len(row)-1): coef[i + 1] = coef[i + 1] - l_rate * error * row[i] print('>epoch=%d, lrate=%.3f, error=%.3f' % (epoch, l_rate, sum_error)) return coef # Calculate coefficients dataset = [[1, 1], [2, 3], [4, 3], [3, 2], [5, 5]] l_rate = 0.001 n_epoch = 50 coef = coefficients_sgd(dataset, l_rate, n_epoch) print(coef) ``` 我們使用0.001的小學習率并且將模型訓練50個時期,或者將系數的50次曝光訓練到整個訓練數據集。 運行該示例在每個時期打印一條消息,該消息包含該時期的總和平方誤差和最后一組系數。 ```py >epoch=45, lrate=0.001, error=2.650 >epoch=46, lrate=0.001, error=2.627 >epoch=47, lrate=0.001, error=2.607 >epoch=48, lrate=0.001, error=2.589 >epoch=49, lrate=0.001, error=2.573 [0.22998234937311363, 0.8017220304137576] ``` 你可以看到即使在最后一個時代,錯誤仍會繼續下降。我們可以訓練更長時間(更多迭代)或增加每個時期更新系數的量(更高的學習率)。 試驗并看看你提出了什么。 現在,讓我們將這個算法應用于真實數據集。 ### 3.葡萄酒質量預測 在本節中,我們將使用隨機梯度下降在葡萄酒質量數據集上訓練線性回歸模型。 該示例假定數據集的CSV副本位于當前工作目錄中,文件名為 **winequality-white.csv** 。 首先加載數據集,將字符串值轉換為數字,并將每列標準化為0到1范圍內的值。這可以通過輔助函數 **load_csv()**和 **str_column_to_float()[來實現]。 HTG3]加載并準備數據集和 **dataset_minmax()**和 **normalize_dataset()**來規范化它。** 我們將使用k-fold交叉驗證來估計學習模型在看不見的數據上的表現。這意味著我們將構建和評估k模型并將表現估計為平均模型誤差。均方根誤差將用于評估每個模型。這些行為在 **cross_validation_split()**, **rmse_metric()**和 **evaluate_algorithm()**輔助函數中提供。 我們將使用上面創建的 **predict()**, **coefficient_sgd()**和 **linear_regression_sgd()**函數來訓練模型。 以下是完整的示例。 ```py # Linear Regression With Stochastic Gradient Descent for Wine Quality from random import seed from random import randrange from csv import reader from math import sqrt # Load a CSV file def load_csv(filename): dataset = list() with open(filename, 'r') as file: csv_reader = reader(file) for row in csv_reader: if not row: continue dataset.append(row) return dataset # Convert string column to float def str_column_to_float(dataset, column): for row in dataset: row[column] = float(row[column].strip()) # Find the min and max values for each column def dataset_minmax(dataset): minmax = list() for i in range(len(dataset[0])): col_values = [row[i] for row in dataset] value_min = min(col_values) value_max = max(col_values) minmax.append([value_min, value_max]) return minmax # Rescale dataset columns to the range 0-1 def normalize_dataset(dataset, minmax): for row in dataset: for i in range(len(row)): row[i] = (row[i] - minmax[i][0]) / (minmax[i][1] - minmax[i][0]) # Split a dataset into k folds def cross_validation_split(dataset, n_folds): dataset_split = list() dataset_copy = list(dataset) fold_size = int(len(dataset) / n_folds) for i in range(n_folds): fold = list() while len(fold) < fold_size: index = randrange(len(dataset_copy)) fold.append(dataset_copy.pop(index)) dataset_split.append(fold) return dataset_split # Calculate root mean squared error def rmse_metric(actual, predicted): sum_error = 0.0 for i in range(len(actual)): prediction_error = predicted[i] - actual[i] sum_error += (prediction_error ** 2) mean_error = sum_error / float(len(actual)) return sqrt(mean_error) # Evaluate an algorithm using a cross validation split def evaluate_algorithm(dataset, algorithm, n_folds, *args): folds = cross_validation_split(dataset, n_folds) scores = list() for fold in folds: train_set = list(folds) train_set.remove(fold) train_set = sum(train_set, []) test_set = list() for row in fold: row_copy = list(row) test_set.append(row_copy) row_copy[-1] = None predicted = algorithm(train_set, test_set, *args) actual = [row[-1] for row in fold] rmse = rmse_metric(actual, predicted) scores.append(rmse) return scores # Make a prediction with coefficients def predict(row, coefficients): yhat = coefficients[0] for i in range(len(row)-1): yhat += coefficients[i + 1] * row[i] return yhat # Estimate linear regression coefficients using stochastic gradient descent def coefficients_sgd(train, l_rate, n_epoch): coef = [0.0 for i in range(len(train[0]))] for epoch in range(n_epoch): for row in train: yhat = predict(row, coef) error = yhat - row[-1] coef[0] = coef[0] - l_rate * error for i in range(len(row)-1): coef[i + 1] = coef[i + 1] - l_rate * error * row[i] # print(l_rate, n_epoch, error) return coef # Linear Regression Algorithm With Stochastic Gradient Descent def linear_regression_sgd(train, test, l_rate, n_epoch): predictions = list() coef = coefficients_sgd(train, l_rate, n_epoch) for row in test: yhat = predict(row, coef) predictions.append(yhat) return(predictions) # Linear Regression on wine quality dataset seed(1) # load and prepare data filename = 'winequality-white.csv' dataset = load_csv(filename) for i in range(len(dataset[0])): str_column_to_float(dataset, i) # normalize minmax = dataset_minmax(dataset) normalize_dataset(dataset, minmax) # evaluate algorithm n_folds = 5 l_rate = 0.01 n_epoch = 50 scores = evaluate_algorithm(dataset, linear_regression_sgd, n_folds, l_rate, n_epoch) print('Scores: %s' % scores) print('Mean RMSE: %.3f' % (sum(scores)/float(len(scores)))) ``` k值為5用于交叉驗證,每次迭代時評估每個折疊4,898 / 5 = 979.6或略低于1000個記錄。通過一些實驗選擇了0.01和50個訓練時期的學習率。 您可以嘗試自己的配置,看看是否可以打敗我的分數。 運行此示例將打印5個交叉驗證折疊中每個折疊的分數,然后打印平均RMSE。 我們可以看到RMSE(在標準化數據集上)是0.126,如果我們只是預測平均值(使用零規則算法),則低于0.148的基線值。 ```py Scores: [0.12248058224159092, 0.13034017509167112, 0.12620370547483578, 0.12897687952843237, 0.12446990678682233] Mean RMSE: 0.126 ``` ## 擴展 本節列出了本教程的一些擴展,您可能希望考慮這些擴展。 * **調整示例**。調整學習率,時期數,甚至數據準備方法,以獲得葡萄酒質量數據集的改進分數。 * **批隨機梯度下降**。改變隨機梯度下降算法以在每個時期累積更新,并且僅在時期結束時批量更新系數。 * **其他回歸問題**。將該技術應用于UCI機器學習庫中的其他回歸問題。 **你有沒有探索過這些擴展?** 請在下面的評論中告訴我。 ## 評論 在本教程中,您了解了如何使用Python從頭開始使用隨機梯度下降來實現線性回歸。 你學到了 * 如何預測多元線性回歸問題。 * 如何使用隨機梯度下降來優化一組系數。 * 如何將該技術應用于真實的回歸預測建模問題。 **你有什么問題嗎?** 在下面的評論中提出您的問題,我會盡力回答。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看