12 抽查回归算法

今天来学习如何使用python scikit learn 来进行一些回归算法的使用。 篇幅限制, 不会对具体算法做过多讨论, 不过后面可以加。

12.1 算法概要

讨论以下算法 线性算法

线性回归RIdge 岭回归LASSO 线性回归Elastic Net Regression 没找到翻译,是一种衍生出来的算法。 非线性算法K近邻CART 决策树SVM 支持向量机 这三种不是分类方法么, 怎么也在这里讨论, 等会通过具体的例子来看看。

解决的问题是波士顿房价问题。 所有参数都是数字型的。 用上述算法来做抽样, 然后用mean squared error 均方误差 来估计结果。

12.1 线性学习算法

12.1.1 线性回归

线性回归假设输入变量有是遵守高斯分布。 而每种特征和结果都有关联, 但是各自之间并没有强关联。

线性回归, 就是把样本的点拟合成一条线, 这条线最大程度可以反应数据的规律。

# 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 岭回归

什么叫岭回归呢。 它是线性回归的一种扩展。 这里可以简单说两句几个基本概念。

线性回归的基本套路: 线性回归的这类问题。 基本过程是这样的:首先要有预测的模型, 然后要计算损失函数,得到问题表达式, 第三就是需要有算法来计算损失函数的系数, 使得最优(可能行最大或者误差最小)

预测的模型, 线性的。

计算损失函数。 两种方法 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

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 非线性机器学习模型

12.3.1 K近邻

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

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

12.4 小结

下一步来比较算法

作者:zzbb

原文地址:https://my.oschina.net/sizhe/blog/1591003

喜欢 0

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: