溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python中怎么實(shí)現(xiàn)一個(gè)抽樣回歸算法

發(fā)布時(shí)間:2021-07-05 16:12:41 來源:億速云 閱讀:177 作者:Leah 欄目:云計(jì)算

本篇文章為大家展示了python中怎么實(shí)現(xiàn)一個(gè)抽樣回歸算法,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

12 抽查回歸算法

12.1 算法概要

討論以下算法 線性算法

  • 線性回歸

  • RIdge 嶺回歸

  • LASSO 線性回歸

  • Elastic Net Regression 沒找到翻譯,是一種衍生出來的算法。 非線性算法

  • K近鄰

  • CART 決策樹

  • SVM 支持向量機(jī) 這三種不是分類方法么, 怎么也在這里討論, 等會(huì)通過具體的例子來看看。

解決的問題是波士頓房?jī)r(jià)問題。 所有參數(shù)都是數(shù)字型的。 用上述算法來做抽樣, 然后用mean squared error 均方誤差 來估計(jì)結(jié)果。

12.1 線性學(xué)習(xí)算法

12.1.1 線性回歸

線性回歸假設(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

12.2.2 嶺回歸

什么叫嶺回歸呢。 它是線性回歸的一種擴(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)很重要.

  1. 正規(guī)方程. 理解就是矩陣直接求逆然后來求導(dǎo).

  2. 高斯牛頓法. 應(yīng)用泰勒展開,

  • 問題的引申. 3) 這種方式呢容易過擬合, 畢竟需要擬合所有的點(diǎn), 因?yàn)槭乔蠼獾玫降? 所以引入了正則化.

    • 首先這個(gè)時(shí)候叫l(wèi)asso 又叫線性回歸的L1正則化

    • 這時(shí)引入了兩種全新的求極值解法坐標(biāo)軸下降法(coordinate descent)和最小角回歸法( Least Angle Regression, LARS)

    1. 如果正則項(xiàng)是平方的形式, 就是嶺回歸. 這時(shí)候的問題容易有維數(shù)過多. - 為什么.

    2. 正則項(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

12.2.3 LASSO 回歸

# 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

12.2.4 ElasticNet 回歸

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

12.3 非線性機(jī)器學(xué)習(xí)模型

12.3.1 K近鄰

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

12.3.2 CART

# 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

12.3.4 SVM

注意 這里的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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI