您好,登錄后才能下訂單哦!
本篇文章為大家展示了python中怎么實(shí)現(xiàn)一個(gè)抽樣回歸算法,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
12.1 算法概要
討論以下算法 線性算法
線性回歸
RIdge 嶺回歸
LASSO 線性回歸
Elastic Net Regression 沒找到翻譯,是一種衍生出來的算法。 非線性算法
K近鄰
CART 決策樹
SVM 支持向量機(jī) 這三種不是分類方法么, 怎么也在這里討論, 等會(huì)通過具體的例子來看看。
解決的問題是波士頓房?jī)r(jià)問題。 所有參數(shù)都是數(shù)字型的。 用上述算法來做抽樣, 然后用mean squared error 均方誤差 來估計(jì)結(jié)果。
線性回歸假設(shè)輸入變量有是遵守高斯分布。 而每種特征和結(jié)果都有關(guān)聯(lián), 但是各自之間并沒有強(qiáng)關(guān)聯(lián)。
線性回歸, 就是把樣本的點(diǎn)擬合成一條線, 這條線最大程度可以反應(yīng)數(shù)據(jù)的規(guī)律。
# 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
什么叫嶺回歸呢。 它是線性回歸的一種擴(kuò)展。 這里可以簡(jiǎn)單說兩句幾個(gè)基本概念。
線性回歸的基本套路: 線性回歸的這類問題。 基本過程是這樣的:首先要有預(yù)測(cè)的模型, 然后要計(jì)算損失函數(shù),得到問題表達(dá)式, 第三就是需要有算法來計(jì)算損失函數(shù)的系數(shù), 使得最優(yōu)(可能行最大或者誤差最小)
預(yù)測(cè)的模型, 線性的。
計(jì)算損失函數(shù)。 兩種方法 1) 極大似然估計(jì)。 這個(gè)呢就是假設(shè)樣本屬于某種分布, 然后得出問題:如何復(fù)制參數(shù)使得這些樣本出現(xiàn)的概率最大。 就是所謂極大似然。 2) 最小二乘。 就是計(jì)算模型得到的值和樣本結(jié)果之間差平方和。 問題是如何使這個(gè)表達(dá)式最小。
上面兩種問題殊途同歸. - 如何證明? 下面來計(jì)算這個(gè)問題 看用何種算法。
1) 梯度下降法 基本的思路就是初始一個(gè)theta向量, 然后計(jì)算一個(gè)value. 更新theta, 原來的theta減去用步長(zhǎng)和最快下降的方向的乘積. 方向就是對(duì)每個(gè)theta求導(dǎo). 之后繼續(xù)計(jì)算結(jié)果直接收斂.
可能是局部收斂. 所以初始點(diǎn)很重要.
正規(guī)方程. 理解就是矩陣直接求逆然后來求導(dǎo).
高斯牛頓法. 應(yīng)用泰勒展開,
問題的引申. 3) 這種方式呢容易過擬合, 畢竟需要擬合所有的點(diǎn), 因?yàn)槭乔蠼獾玫降? 所以引入了正則化.
首先這個(gè)時(shí)候叫l(wèi)asso 又叫線性回歸的L1正則化
這時(shí)引入了兩種全新的求極值解法坐標(biāo)軸下降法(coordinate descent)和最小角回歸法( Least Angle Regression, LARS)
如果正則項(xiàng)是平方的形式, 就是嶺回歸. 這時(shí)候的問題容易有維數(shù)過多. - 為什么.
正則項(xiàng)是拉姆達(dá)乘以一個(gè)的 一次的絕對(duì)值. 對(duì)這個(gè)問題求解, 問題是絕對(duì)值是不連續(xù)的 不可導(dǎo) 是跳躍的, 這樣呢就不能用梯度下降和正規(guī)方程的做法.
這節(jié)是嶺回歸, 下一節(jié)是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近鄰是基于距離的一種算法。 在訓(xùn)練集中找到k個(gè)和這個(gè)新的紀(jì)錄的距離最近的。 一個(gè)平均值作為預(yù)測(cè)結(jié)果。
因?yàn)槊看味家容^所有的距離, 這個(gè)算法的預(yù)測(cè)過程是比較慢的。
距離, 默認(rèn)是閔科夫斯基距離。 還有歐氏距離和曼哈頓距離。
# 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
上述內(nèi)容就是python中怎么實(shí)現(xiàn)一個(gè)抽樣回歸算法,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。