【Python与机器学习4-4】线性回归和逻辑回归

线性回归和逻辑回归

线性模型
线性模型:给定一个测试样本,通过加权求和该样本的特征值计算其结果并作为预测值。
例如通过房子的两个特征 每年的房产税(XTAX)和房屋年龄(XAGE),预测房子的价格。
则先通过这二维特征学出来一个式子,然后有新的房产税和房屋年龄数据时,把数据代进式子中得到的结果即预测的房屋价格

线性回归

线性回归问题

学习也就是学出来模型的参数
这里写图片描述

例子:
如样本中只有一维特征,即函数为ax+b的形式,我们学习出a和b,也就是训练好了模型
这里写图片描述

最小二乘法求解参数
残差平方和

被选择的参数,应该使拟合出的预测值曲线与观测值(真实值)之差的平方和最小。该值也叫做:残差平方和( residual sum of squares, RSS)
这里写图片描述

scikit-learn调用线性回归模型

调用线型回归模型

linreg = LinearRegression()

训练模型

linreg.fit(X_train, y_train)

输出结果 各个参数的值

线型模型的系数(w) linreg.coef_
线型模型的常数项(b) linreg.intercept_

例子
# 人工生成用于测试回归的数据集
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
%matplotlib inline

plt.figure()
plt.title('Sample regression problem with one input variable')

X_R1, y_R1 = make_regression(n_samples = 100, n_features=1,
                            n_informative=1, bias = 150.0,
                            noise = 30, random_state=0)# 每个样本只有一个变量

plt.scatter(X_R1, y_R1, marker= 'o', s=50) #画出散点图
plt.show()



# *****开始训练啦******
from sklearn.linear_model import LinearRegression

X_train, X_test, y_train, y_test = train_test_split(X_R1, y_R1,
                                                   random_state = 0)
# 调用线型回归模型
linreg = LinearRegression()

# 训练模型
linreg.fit(X_train, y_train)

# 输出结果
print('线型模型的系数(w): {}'.format(linreg.coef_))
print('线型模型的常数项(b): {:.3f}'.format(linreg.intercept_))
print('训练集中R-squared得分: {:.3f}'.format(linreg.score(X_train, y_train)))
print('测试集中R-squared得分: {:.3f}'.format(linreg.score(X_test, y_test)))


# *********可视化输出结果**********

plt.figure(figsize=(5,4))
plt.scatter(X_R1, y_R1, marker= 'o', s=50, alpha=0.8)
plt.plot(X_R1, linreg.coef_ * X_R1 + linreg.intercept_, 'r-') #画出预测出来的那条线
plt.title('Least-squares linear regression')
plt.xlabel('Feature value (x)')
plt.ylabel('Target value (y)')
plt.show()

这里写图片描述

逻辑回归

逻辑回归其实仅为在线性回归的基础上,套用了一个逻辑函数,通过逻辑函数把预测值限定在[0,1]之间,从而减小预测范围。
逻辑回归是做分类的,预测离散型类别

这里写图片描述

scikit-learn调用逻辑回归模型

调用逻辑回归模型

lr_model = LogisticRegression(C=c_value)

训练模型

lr_model.fit(X_train, y_train)

例子
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from ml_visualization import plot_class_regions_for_classifier

# 加载数据集
fruits_df = pd.read_table('fruit_data_with_colors.txt')

X = fruits_df[['width', 'height']]
y = fruits_df['fruit_label'].copy()

# 将不是apple的标签设为0
y[y != 1] = 0
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/4, random_state=0)

# 不同的C值
c_values = [0.1, 1, 100]

for c_value in c_values:
    # 建立模型
    lr_model = LogisticRegression(C=c_value)

    # 训练模型
    lr_model.fit(X_train, y_train)

    # 验证模型
    y_pred = lr_model.predict(X_test)

    acc = accuracy_score(y_test, y_pred)
    print('C={},准确率:{:.3f}'.format(c_value, acc))

    # 可视化
    plot_class_regions_for_classifier(lr_model, X_test.values, y_test.values, title='C={}'.format(c_value))

线性回归和逻辑回归的区别与联系

区别

线性回归主要用来解决连续值预测的问题。
逻辑回归用来解决分类的问题,输出的属于某个类别的概率。

联系

线性回归和逻辑回归在本质上都是线性的。

过拟合和正则化

过拟合问题

过拟合是指在调适一个统计模型时,使用过多参数。模型对于训练数据拟合程度过当,以致太适应训练数据而非一般情况。即在训练数据上表现非常好,但是在测试数据或验证数据上表现很差。
这里写图片描述

下图可以看出,对训练集的迭代次数越多则对训练集来说损失越来越小,但是这时候就会出现过拟合现象,迭代次数太多时,训练出的模型虽然在训练集上表现非常好,但是在测试集上损失会特别大,这就出现了过拟合现象。
这里写图片描述

对过拟合的解决方法–正则化

正则化问题

正则化是用来控制模型复杂度的,因为模型复杂度越高,越容易过拟合。从上面的过拟合问题可以看出并不是损失函数越小模型就越好,还需要考虑过拟合问题,因此正则化就是用来平衡损失函数和模型复杂度的。也就是让损失函数和模型复杂度之和最小。
这里写图片描述

L2正则化

因为模型学习得到的权重越大,模型复杂度越高。
L2正则化模型复杂度就是计算所有权重的平方和 ,L2正则化就是惩罚特别大的权重项。

这里写图片描述
式子中的入表示正则化的强弱。
- 入值越大,正则化越强,表示需要更多关注模型的复杂度,适用于测试集中的样本与训练集中的样本相差比较大时;
- 入值越小,正则化越弱,表示需要更多关注损失函数,适用于测试集中的样本与训练集中的样本相差不是很大。

逻辑回归的正则化

这里写图片描述

注意:sklearn中,logistic regression的参数C是正则项系数的导数,C=1/入,正则项中的C值决定了正则化的强度

•入值越大(C值越小),正则化越强,对于单个样本的错误分类具有较强的容错度,也就是不容易出现过拟合现象
•入值越小(C值越大),正则化越弱,尽可能地去拟合训练样本的数据,容易出现过拟合现象。
对分类器来说,每个样本都很重要,所以这种情况就需要设定较小的入值使正则化弱一些。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值