对大量的观测数据进行处理,从而得到比较符合事物内部规律的数学表达式。也就是说寻找到数据与数据之间的规律所在,从而就可以模拟出结果,也就是对结果进行预测。解决的就是通过已知的数据得到未知的结果。例如:对房价的预测、判断信用评价、电影票房预估等。
Loss Function–MSE
利用梯度下降法找到最小值点,也就是最小误差,最后把 w 和 b 给求出来。
使用正则化项,也就是给loss function加上一个参数项,正则化项有L1正则化、L2正则化、ElasticNet。加入这个正则化项好处:
控制参数幅度,不让学习到的模型参数过大。
限制参数搜索空间
解决欠拟合与过拟合的问题。
在loss function的基础上加入w参数的平方和乘以 λ,假设:
此时我们的任务变成在L约束下求出J取最小值的解。求解J0的过程可以画出等值线。同时L2正则化的函数L也可以在w1w2的二维平面上画出来。如下图:
L表示为图中的黑色圆形,随着梯度下降法的不断逼近,与圆第一次产生交点,而这个交点很难出现在坐标轴上。这就说明了L2正则化不容易得到稀疏矩阵,同时为了求出损失函数的最小值,使得w1和w2无限接近于0,达到防止过拟合的问题。
只要数据线性相关,用LinearRegression拟合的不是很好,需要正则化,可以考虑使用岭回归(L2), 如何输入特征的维度很高,而且是稀疏线性关系的话, 岭回归就不太合适,考虑使用Lasso回归。
L1正则化与L2正则化的区别在于惩罚项的不同:
求解J0的过程可以画出等值线。同时L1正则化的函数也可以在w1w2的二维平面上画出来。如下图:
惩罚项表示为图中的黑色棱形,随着梯度下降法的不断逼近,与棱形第一次产生交点,而这个交点很容易出现在坐标轴上。这就说明了L1正则化容易得到稀疏矩阵。
L1正则化(Lasso回归)可以使得一些特征的系数变小,甚至还使一些绝对值较小的系数直接变为0,从而增强模型的泛化能力 。对于高的特征数据,尤其是线性关系是稀疏的,就采用L1正则化(Lasso回归),或者是要在一堆特征里面找出主要的特征,那么L1正则化(Lasso回归)更是首选了。
ElasticNet综合了L1正则化项和L2正则化项,以下是它的公式:
ElasticNet在我们发现用Lasso回归太过(太多特征被稀疏为0),而岭回归也正则化的不够(回归系数衰减太慢)的时候,可以考虑使用ElasticNet回归来综合,得到比较好的结果。
我们假设线性回归的噪声服从均值为0的正态分布。 当噪声符合正态分布N(0,delta^2)
时,因变量则符合正态分布N(ax(i)+b,delta^2)
, 其中预测函数y=ax(i)+b。这个结论可以由正态分布的概率密度函数得到。也就是说当噪声符合正态分布时,其因变量必然也符合正态分布。
在用线性回归模型拟合数据之前,首先要求数据应符合或近似符合正态分布,否则得到的拟合函数不正确。
从给定的房屋基本信息以及房屋销售信息等,建立一个回归模型预测房屋的销售价格。 数据下载
https://pan.baidu.com/share/link?shareid=1601116739&uk=1865796174#list/path=%2F 密码:mfqy
数据说明: 数据主要包括2014年5月至2015年5月美国King County的房屋销售价格以及房屋的基本信息。 数据分为训练数据和测试数据,分别保存在kc_train.csv和kc_test.csv两个文件中。 其中训练数据主要包括10000条记录,14个字段,主要字段说明如下: 第一列“销售日期”:2014年5月到2015年5月房屋出售时的日期 第二列“销售价格”:房屋交易价格,单位为美元,是目标预测值 第三列“卧室数”:房屋中的卧室数目 第四列“浴室数”:房屋中的浴室数目 第五列“房屋面积”:房屋里的生活面积 第六列“停车面积”:停车坪的面积 第七列“楼层数”:房屋的楼层数 第八列“房屋评分”:King County房屋评分系统对房屋的总体评分 第九列“建筑面积”:除了地下室之外的房屋建筑面积 第十列“地下室面积”:地下室的面积 第十一列“建筑年份”:房屋建成的年份 第十二列“修复年份”:房屋上次修复的年份 第十三列"纬度":房屋所在纬度 第十四列“经度”:房屋所在经度
测试数据主要包括3000条记录,13个字段,跟训练数据的不同是测试数据并不包括房屋销售价格,需要通过由训练数据所建立的模型以及所给的测试数据,得出测试数据相应的房屋销售价格预测值。
1.选择合适的模型,对模型的好坏进行评估和选择。
2.对缺失的值进行补齐操作,可以使用均值的方式补齐数据,使得准确度更高。
3.数据的取值一般跟属性有关系,但世界万物的属性是很多的,有些值小,但不代表不重要,所有为了提高预测的准确度,统一数据维度进行计算,方法有特征缩放和归一法等。
4.数据处理好之后就可以进行调用模型库进行训练了。
5.使用测试数据进行目标函数预测输出,观察结果是否符合预期。或者通过画出对比函数进行结果线条对比。
y表示我们要求的销售价格,x表示特征值。需要调用sklearn库来进行训练。
下载的是两个数据文件,一个是真实数据,一个是测试数据,打开kc_train.csv,能够看到第二列是销售价格,而我们要预测的就是销售价格,所以在训练过程中是不需要销售价格的,把第二列删除掉,新建一个csv文件存放销售价格这一列,作为后面的结果对比。
首先先读取数据,查看数据是否存在缺失值,然后进行特征缩放统一数据维度
#读取数据
housing = pd.read_csv('kc_train.csv')
target=pd.read_csv('kc_train2.csv') #销售价格
t=pd.read_csv('kc_test.csv') #测试数据
#数据预处理
housing.info() #查看是否有缺失值
#特征缩放
from sklearn.preprocessing import MinMaxScaler
minmax_scaler=MinMaxScaler()
minmax_scaler.fit(housing) #进行内部拟合,内部参数会发生变化
scaler_housing=minmax_scaler.transform(housing)
scaler_housing=pd.DataFrame(scaler_housing,columns=housing.columns)
使用sklearn库的线性回归函数进行调用训练。梯度下降法获得误差最小值。最后使用均方误差法来评价模型的好坏程度,并画图进行比较。
#选择基于梯度下降的线性回归模型
from sklearn.linear_model import LinearRegression
LR_reg=LinearRegression()
#进行拟合
LR_reg.fit(scaler_housing,target)
#使用均方误差用于评价模型好坏
from sklearn.metrics import mean_squared_error
preds=LR_reg.predict(scaler_housing) #输入数据进行预测得到结果
mse=mean_squared_error(preds,target) #使用均方误差来评价模型好坏,可以输出mse进行查看评价值
#绘图进行比较
plot.figure(figsize=(10,7)) #画布大小
num=100
x=np.arange(1,num+1) #取100个点进行比较
plot.plot(x,target[:num],label='target') #目标取值
plot.plot(x,preds[:num],label='preds') #预测取值
plot.legend(loc='upper right') #线条显示位置
plot.show()
如果想要预测test文件里的数据,那就把test文件里的数据进行读取,并且进行特征缩放,调用: LR_reg.predict(test) 就可以得到预测结果,并进行输出操作。