一.回归算法-线性回归

1.概念和公式

线性回归的定义是:目标值预期是输入变量的线性组合。线性模型形式简单、易于建模,但却蕴含着机器学习中一些重要的基本思想。线性回归,是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。

  • 单变量线性回归:涉及到的变量只有一个。
  • 多变量线性回归:涉及到的变量两个或者两个以上。

线性回归的通用公式如下:

对于多变量线性回归来说我们可以通过向量的方式来表示W值与特征X值之间的关系:

2.损失函数

将模型与数据点之间的距离差之和做为衡量匹配好坏的标准。

即可得到损失函数——模型与数据差的平方和最小(最小二乘法)

要另该损失函数的值最小,可以用两种方法:一种使用梯度下降算法另一种使正规方程解法(只使用与简单的线性回归)。

一般用的是梯度下降法,具体的算法推导到《西瓜书》相应章节的笔记再进行详细介绍.

3.API

  • 正规方程:sklearn.linear_model.LinearRegression()
    • coef_ :回归系数
  • 梯度下降:sklearn.linaer_model.SGDRegressor()
    • coef_ :回归系数

4.示例

波士顿房价预测:

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor

lb = load_boston()

# 分隔数据集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

# 特征工程-标准化
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
# 目标值
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))

# 正则方程求解预测结果
lr = LinearRegression()
lr.fit(x_train, y_train)
print(lr.coef_)
# 预测的价格
y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
print("使用正规方程每个房子的预测价格:", y_lr_predict)

# 使用梯度下降进行预测
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print(lr.coef_)
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
print("使用梯度下降预测的房子价格:", y_sgd_predict)

5.回归性能评估

对于不同的类别预测,我们不能苛刻的要求回归预测的数值结果要严格的与真实值相同。一般情况下,我们希望衡量预测值与真实值之间的差距。

因此,可以测评函数进行评价。其中最为直观的评价指标均方误差(Mean Squared Error)MSE,因为这也是线性回归模型所要优化的目标。

MSE的计算方法如下:

回归性能评估的API

mean_squared_error(y_true, y_pred)

from sklearn.metrics import mean_squared_error
...
print("正规方程的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))
...
print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))

结果:

正规方程的均方误差: 25.14886868419582
梯度下降的均方误差: 25.962570579781715

6.线性回归解决过拟合和欠拟合的方法

  • 欠拟合:原因:学习到数据的特征过少
    • 解决办法:增加数据的特征数量
  • 过拟合:原因:原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点
    • 解决办法:
      • 进行特征选择,消除关联性大的特征(很难做)
      • 交叉验证(让所有数据都有过训练)
      • 正则化

7.L2正则化和岭回归

L2正则化

适用于大部分机器学习算法的过拟合处理。过拟合大部分原因是由于参数过多或过大,模型过于复杂。而L2正则化能将参数变小。

具有L2正则化的线性最小二乘法为岭回归。

岭回归

岭回归是一种专用于线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对数据的拟合要强于最小二乘法。

API:sklearn.linear_model.Ridge(alpha=1.0)

  • alpha:正则化力度
  • coef_:回归系数

实例:

使用岭回归预测前面的波斯顿房价的例子:

from sklearn.linear_model import Ridge
...
# 岭回归预测房价
rd = Ridge(alpha=1.0)
rd.fit(x_train, y_train)
print(rd.coef_)
y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
print("岭回归预测的房子价格:", y_rd_predict)
print("岭回归的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))

岭回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研究中有较大的实用价值。

二.分类算法-逻辑回归

1.逻辑回归简洁

逻辑回归特点:能够使我们的特征输入集合转化为0和1这两类的概率。

一般来说,回归不用在分类问题上,因为回归是连续型模型,而且受噪声影响比较大。如果非要应用进了,那就需要用逻辑回归了。

Logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射:即先把特征线性求和,然后使用函数g(z)将作为假设函数来预测,g(z)可以将连续值映射到0和1上。

映射函数为:

( g(z)为sigmoid函数,即生物中的S型生长曲线 )

映射效果:

2.逻辑回归的损失函数、优化

与线性回归原理相同,但由于是分类问题,损失函数不一样,逻辑回归的损失函数只能通过梯度下降求解。

损失函数:

对数似然损失函数:

cost损失的值越小,那么预测的类别准确度更高

y=1时:

y=0时:

3.API

sklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0)

  • coef_:回归系数

4.案例

数据下载地址:https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/

column = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
          'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli',
          'Mitoses', 'Class']
# 读取数据
data = pd.read_csv(
    "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",
    names=column)
# print(data)

# 缺失值进行处理
data.replace(to_replace="?", value=np.nan, inplace=True)
data.dropna(inplace=True)

# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]])

# 标准化处理
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)

# 逻辑回归预测
lg = LogisticRegression(C=1.0)
lg.fit(x_train, y_train)
print(lg.coef_)

y_predict = lg.predict(x_test)
print("准确率:", lg.score(x_test, y_test))
print("精准率和召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"]))

5.LogisticRegression总结

应用:广告点击率预测、电商购物搭配推荐

优点:适合需要得到一个分类概率的场景

缺点:当特征空间很大时,逻辑回归的性能不是很好(看硬件能力)