千家信息网

python中怎么实现一个抽样回归算法

发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,本篇文章为大家展示了python中怎么实现一个抽样回归算法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。12 抽查回归算法12.1 算法概要讨论以下算法 线性
千家信息网最后更新 2024年11月30日python中怎么实现一个抽样回归算法

本篇文章为大家展示了python中怎么实现一个抽样回归算法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

12 抽查回归算法

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求导. 之后继续计算结果直接收敛.

  • 可能是局部收敛. 所以初始点很重要.

  1. 正规方程. 理解就是矩阵直接求逆然后来求导.

  2. 高斯牛顿法. 应用泰勒展开,

  • 问题的引申. 3) 这种方式呢容易过拟合, 毕竟需要拟合所有的点, 因为是求解得到的. 所以引入了正则化.

    • 首先这个时候叫lasso 又叫线性回归的L1正则化

    • 这时引入了两种全新的求极值解法坐标轴下降法(coordinate descent)和最小角回归法( Least Angle Regression, LARS)

    1. 如果正则项是平方的形式, 就是岭回归. 这时候的问题容易有维数过多. - 为什么.

    2. 正则项是拉姆达乘以一个的 一次的绝对值. 对这个问题求解, 问题是绝对值是不连续的 不可导 是跳跃的, 这样呢就不能用梯度下降和正规方程的做法.

这节是岭回归, 下一节是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中怎么实现一个抽样回归算法,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

0