您好,登錄后才能下訂單哦!
本篇文章為大家展示了python中怎么實現一個抽樣回歸算法,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
12.1 算法概要
討論以下算法 線性算法
線性回歸
RIdge 嶺回歸
LASSO 線性回歸
Elastic Net Regression 沒找到翻譯,是一種衍生出來的算法。 非線性算法
K近鄰
CART 決策樹
SVM 支持向量機 這三種不是分類方法么, 怎么也在這里討論, 等會通過具體的例子來看看。
解決的問題是波士頓房價問題。 所有參數都是數字型的。 用上述算法來做抽樣, 然后用mean squared error 均方誤差 來估計結果。
線性回歸假設輸入變量有是遵守高斯分布。 而每種特征和結果都有關聯, 但是各自之間并沒有強關聯。
線性回歸, 就是把樣本的點擬合成一條線, 這條線最大程度可以反應數據的規律。
# Linear Regression from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.linear_model import LinearRegression filename = 'housing.csv' names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] dataframe = read_csv(filename, delim_whitespace=True, names=names) array = dataframe.values X = array[:,0:13] Y = array[:,13] kfold = KFold(n_splits=10, random_state=7) model = LinearRegression() scoring = 'neg_mean_squared_error' results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print(results.mean()) # -34.7052559445
什么叫嶺回歸呢。 它是線性回歸的一種擴展。 這里可以簡單說兩句幾個基本概念。
線性回歸的基本套路: 線性回歸的這類問題。 基本過程是這樣的:首先要有預測的模型, 然后要計算損失函數,得到問題表達式, 第三就是需要有算法來計算損失函數的系數, 使得最優(可能行最大或者誤差最小)
預測的模型, 線性的。
計算損失函數。 兩種方法 1) 極大似然估計。 這個呢就是假設樣本屬于某種分布, 然后得出問題:如何復制參數使得這些樣本出現的概率最大。 就是所謂極大似然。 2) 最小二乘。 就是計算模型得到的值和樣本結果之間差平方和。 問題是如何使這個表達式最小。
上面兩種問題殊途同歸. - 如何證明? 下面來計算這個問題 看用何種算法。
1) 梯度下降法 基本的思路就是初始一個theta向量, 然后計算一個value. 更新theta, 原來的theta減去用步長和最快下降的方向的乘積. 方向就是對每個theta求導. 之后繼續計算結果直接收斂.
可能是局部收斂. 所以初始點很重要.
正規方程. 理解就是矩陣直接求逆然后來求導.
高斯牛頓法. 應用泰勒展開,
問題的引申. 3) 這種方式呢容易過擬合, 畢竟需要擬合所有的點, 因為是求解得到的. 所以引入了正則化.
首先這個時候叫lasso 又叫線性回歸的L1正則化
這時引入了兩種全新的求極值解法坐標軸下降法(coordinate descent)和最小角回歸法( Least Angle Regression, LARS)
如果正則項是平方的形式, 就是嶺回歸. 這時候的問題容易有維數過多. - 為什么.
正則項是拉姆達乘以一個的 一次的絕對值. 對這個問題求解, 問題是絕對值是不連續的 不可導 是跳躍的, 這樣呢就不能用梯度下降和正規方程的做法.
這節是嶺回歸, 下一節是LASSO 回歸
# Ridge Regression from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.linear_model import Ridge filename = 'housing.csv' names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] dataframe = read_csv(filename, delim_whitespace=True, names=names) array = dataframe.values X = array[:,0:13] Y = array[:,13] num_folds = 10 kfold = KFold(n_splits=10, random_state=7) model = Ridge() scoring = 'neg_mean_squared_error' results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print(results.mean()) # -34.0782462093
# Lasso Regression from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.linear_model import Lasso filename = 'housing.csv' names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] dataframe = read_csv(filename, delim_whitespace=False, names=names) array = dataframe.values X = array[:,0:13] Y = array[:,13] kfold = KFold(n_splits=10, random_state=7) model = Lasso() scoring = 'neg_mean_squared_error' results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print(results.mean()) # -34.4640845883
ElasticNet 回歸綜合了嶺回歸和LASSO 回歸, 也就是說添加了L1正則, 和L2正則。 來看看效果。
# ElasticNet Regression from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.linear_model import ElasticNet filename = 'housing.csv' names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] dataframe = read_csv(filename, delim_whitespace=True, names=names) array = dataframe.values X = array[:,0:13] Y = array[:,13] kfold = KFold(n_splits=10, random_state=7) model = ElasticNet() scoring = 'neg_mean_squared_error' results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print(results.mean()) # -31.1645737142
K近鄰是基于距離的一種算法。 在訓練集中找到k個和這個新的紀錄的距離最近的。 一個平均值作為預測結果。
因為每次都要比較所有的距離, 這個算法的預測過程是比較慢的。
距離, 默認是閔科夫斯基距離。 還有歐氏距離和曼哈頓距離。
# KNN Regression from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.neighbors import KNeighborsRegressor filename = 'housing.csv' names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] dataframe = read_csv(filename, delim_whitespace=False, names=names) array = dataframe.values X = array[:,0:13] Y = array[:,13] kfold = KFold(n_splits=10, random_state=7) model = KNeighborsRegressor() scoring = 'neg_mean_squared_error' results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print(results.mean()) # -107.28683898
# Decision Tree Regression from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.tree import DecisionTreeRegressor filename = 'housing.csv' names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] dataframe = read_csv(filename, delim_whitespace=False, names=names) array = dataframe.values X = array[:,0:13] Y = array[:,13] kfold = KFold(n_splits=10, random_state=7) model = DecisionTreeRegressor() scoring = 'neg_mean_squared_error' results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print(results.mean()) # -34.74746
注意 這里的SVM 是基于LIBSVM 包的。
# SVM Regression from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.svm import SVR filename = 'housing.csv' names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV'] dataframe = read_csv(filename, delim_whitespace=False, names=names) array = dataframe.values X = array[:,0:13] Y = array[:,13] num_folds = 10 kfold = KFold(n_splits=10, random_state=7) model = SVR() scoring = 'neg_mean_squared_error' results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring) print(results.mean()) # -91.0478243332
上述內容就是python中怎么實現一個抽樣回歸算法,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。