本篇文章为大家展示了python中怎么实现一个抽样回归算法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
12 抽查回归算法
1 算法概要
讨论以下算法 线性算法
线性回归
RIdge 岭回归
LASSO 线性回归
Elastic Net Regression 没找到翻译,是一种衍生出来的算法。 非线性算法
K近邻
CART 决策树
SVM 支持向量机 这三种不是分类方法么, 怎么也在这里讨论, 等会通过具体的例子来看看。
解决的问题是波士顿房价问题。 所有参数都是数字型的。 用上述算法来做抽样, 然后用mean squared error 均方误差 来估计结果。
12.1 线性学习算法
12.1.1 线性回归
线性回归假设输入变量有是遵守高斯分布。 而每种特征和结果都有关联, 但是各自之间并没有强关联。
线性回归, 就是把样本的点拟合成一条线, 这条线最大程度可以反应数据的规律。
# Linear Regressionfrom pandas import read_csvfrom sklearn.model_selection import KFoldfrom sklearn.model_selection import cross_val_scorefrom sklearn.linear_model import LinearRegressionfilename = '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.valuesX = 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 Regressionfrom pandas import read_csvfrom sklearn.model_selection import KFoldfrom sklearn.model_selection import cross_val_scorefrom sklearn.linear_model import Ridgefilename = '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.valuesX = array[:,0:13]Y = array[:,13]num_folds = 10kfold = 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 Regressionfrom pandas import read_csvfrom sklearn.model_selection import KFoldfrom sklearn.model_selection import cross_val_scorefrom sklearn.linear_model import Lassofilename = '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.valuesX = 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 Regressionfrom pandas import read_csvfrom sklearn.model_selection import KFoldfrom sklearn.model_selection import cross_val_scorefrom sklearn.linear_model import ElasticNetfilename = '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.valuesX = 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 Regressionfrom pandas import read_csvfrom sklearn.model_selection import KFoldfrom sklearn.model_selection import cross_val_scorefrom sklearn.neighbors import KNeighborsRegressorfilename = '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.valuesX = 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 Regressionfrom pandas import read_csvfrom sklearn.model_selection import KFoldfrom sklearn.model_selection import cross_val_scorefrom sklearn.tree import DecisionTreeRegressorfilename = '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.valuesX = 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 Regressionfrom pandas import read_csvfrom sklearn.model_selection import KFoldfrom sklearn.model_selection import cross_val_scorefrom sklearn.svm import SVRfilename = '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.valuesX = array[:,0:13]Y = array[:,13]num_folds = 10kfold = 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中怎么实现一个抽样回归算法,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。