本篇文章为大家展示了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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。