1.线性回归的原理
回归方程对一个或者多个自变量和因变量之间关系进行建模的一种分析方式
y = w1x1+w2x2+w3x3...+b
只有一个变量的情况,称为单变量回归;多个自变量情况叫做多元回归。
线性模型不一定都是指这样的直线,也可以是弯的。
因为广义线性模型的定义:
1.自变量是一次方(这个是线性模型,线性关系) Y = w1x1 + w2x2 + w3x3 + ... + wnxn + b
2.参数是一次方,参数w是一次,这个是线性模型,但不是线性关系。 因为他的图形形状不是直线。 Y = w1x1 + w2x1^2 + w3x1^3 ... + b
线性关系 & 线性模型
线性关系一定是线性模型
线性模型不一定是线性关系
(可以这么理解,模型的范围 > 关系)
如何去找到合适的线性模型去表示? 目标:找到合适的参数使得模型预测准确(如何能够找到合适的模型?————损失函数)
线性模型中,比较参数的好坏应该是看点到线性方程的距离.如下图所示,我们根据点到直线的距离作为依据,然后判断这个参数的好坏。
这个距离指标称为:损失函数/cost/成本函数/目标函数
y_i 第i个训练样本数据的真实值
式子也被称为最小二乘法,因为我们需要去找到使得这个损失函数最小的w,因为这个式子有平方,因此我们称这个式子为最小二乘法。
我们知道了指标,具体要怎么做?如何优化 1.正则方程
一步到位,X为特征值矩阵,y为目标值矩阵。
缺点:当特征值过于复杂的时候,因为有求逆的步骤,所以求解的速度很慢。并且可能预测效果没有很好。
2.梯度下降
API:
一:正则化方法进行线性回归
Sklearn.linear_model.LinearRegression(fit_intercept=True) fit_intercept=True 是否添加偏置,一般为True,不然回归方程方程只能是通过原点的函数
步骤:
def linear1():
"""
正规方程的优化方法对波士顿房价进行预测
:return:
"""
# 1)获取数据
boston = load_boston()
# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
# 3)标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4)预估器
estimator = LinearRegression()
estimator.fit(x_train, y_train)
# 5)得出模型
print("正规方程-权重系数为:\n", estimator.coef_)
print("正规方程-偏置为:\n", estimator.intercept_)
# 6)模型评估
y_predict = estimator.predict(x_test)
print("预测房价:\n", y_predict)
error = mean_squared_error(y_test, y_predict)
print("正规方程-均方误差为:\n", error)
return None
特征有几个,权重系数就有多少个。
二:梯度下降
def linear2():
"""
梯度下降的优化方法对波士顿房价进行预测
:return:
"""
# 1)获取数据
boston = load_boston()
print("特征数量:\n", boston.data.shape)
# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
# 3)标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4)预估器
# learning_rate这个参数来选择学习率调整使用什么方法,因为我们希望在斜率大的地方,学习率大点,斜率小的地方,学习率小点。eta0是学习率的初始值。max_iter最大的迭代次数;为了防止过拟合,penalty惩罚项系数。
estimator = SGDRegressor(learning_rate="constant", eta0=0.01, max_iter=10000, penalty="l1")
estimator.fit(x_train, y_train)
# 5)得出模型
print("梯度下降-权重系数为:\n", estimator.coef_)
print("梯度下降-偏置为:\n", estimator.intercept_)
# 6)模型评估
y_predict = estimator.predict(x_test)
print("预测房价:\n", y_predict)
error = mean_squared_error(y_test, y_predict)
print("梯度下降-均方误差为:\n", error)
return None
如何评估一个线性回归方程的性能: 指标:均方误差MSE
和损失函数差不多,就是这个有求一个平均。
梯度下降法和正则法的对比
梯度下降 | 正规方程 |
---|---|
需要选择学习率 | 不需要 |
需要迭代求解 | 一次运算得出 |
特征数量较大可以使用 | 需要计算方程,如果特征数量大的画,时间复杂度高 |
能够解决拟合问题 | 不能解决拟合问题 |
梯度下降的优化方法:
算法的选择
1.GD, 2.SGD, 3.SAG
1.GD:Gradient descent 梯度下降 需要把所有的样本值都计算出来,计算量大
2.SGD 随机梯度下降 SGD:高效且容易实现 缺点:需要很多的超参数
3.SAG 随机平均梯度下降法
sklearn中的API都实现了SAG优化。
欠拟合: 原因:学习到的数据特征过少 解决方法:增加数据的学习特征数量
过拟合: 原因:模型过于复杂,原始的特征过多
解决方法:正则化,即尽量减小高次项的影响。
L1正则化 LASSO回归 公式
作用:使得一些W的数值直接为0,具有特征选择的能力。
L2正则化 Ridge(岭回归)
这个L2正则化后的损失函数,就是原本的损失函数(为了更好的求导,所以使用2m作为分母)+λ惩罚项
作用:去改变损失函数的方程,因为损失函数是越小越好,所以L2正则化系统就是说希望改变后面的正则化项。 也就是会优化w,使得其中一些W都很小,接近于0,来削弱某些特征的影响。
m 样本数, n 特征数 这个L2正则化后的损失函数,就是原本的损失函数(为了更好的求导,所以使用2m作为分母)+λ惩罚项
岭回归就是带L2正则化的线性回归
正则化系数对于权重的影响。
由图可知,
def linear3():
"""
岭回归对波士顿房价进行预测
:return:
"""
# 1)获取数据
boston = load_boston()
print("特征数量:\n", boston.data.shape)
# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
# 3)标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4)预估器
estimator = Ridge(alpha=0.5, max_iter=10000)
estimator.fit(x_train, y_train)
# 保存模型
# joblib.dump(estimator, "my_ridge.pkl")
# 加载模型
#estimator = joblib.load("my_ridge.pkl")
# 5)得出模型
print("岭回归-权重系数为:\n", estimator.coef_)
print("岭回归-偏置为:\n", estimator.intercept_)
# 6)模型评估
y_predict = estimator.predict(x_test)
print("预测房价:\n", y_predict)
error = mean_squared_error(y_test, y_predict)
print("岭回归-均方误差为:\n", error)
return None
虽然叫回归,但是它是用来处理分类的。
应用场景:(大部分是二分类)
线性回归算法的输出就是逻辑回归算法的输入。 它的损失函数和线性回归算法的损失函数不一样,它是对数似然损失。(吴恩达老师视频中的损失函数就是这个 )
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.metrics import roc_auc_score
# 1、读取数据
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
#因为这个数据集数据没有名称,因此要为数据添加名称
column_name = ['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(path, names=column_name)
# 2、数据处理
# 缺失值处理 数据集中有一些数据缺失,要将 ?替换掉
# 1)替换-》np.nan 将数据标记成无效值
data = data.replace(to_replace="?", value=np.nan)
# 2)删除缺失样本,因为他是去找nan数据,将具有nan数据类型的数据删除
data.dropna(inplace=True)
#data.isnull().any() # 不存在缺失值 如果输出都为False ,则说明输出不存在缺失值
# 3、划分数据集
# 筛选特征值和目标值
x = data.iloc[:, 1:-1]
y = data["Class"]
x_train, x_test, y_train, y_test = train_test_split(x, y)
#4.特征工程 标准化数据集
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 5、预估器流程
estimator = LogisticRegression()
estimator.fit(x_train, y_train)
# 5)得出模型
print("权重系数为:\n", estimator.coef_)
print("偏置为:\n", estimator.intercept_)
# 6、模型评估
# 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)
# 方法2:计算准确率
#这个是测量模型的准确性,通过测试集来看训练集训练出来的模型
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)
#因为我们更想知道判断癌症的准确率
# 查看精确率、召回率、F1-score
report = classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"])
print(report)
# y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
# 将y_test 转换成 0 1,因为roc_auc_score这个指标只能传入0和1
y_true = np.where(y_test > 3, 1, 0)
roc_auc_score(y_true, y_predict)
二分类的指标不是使用score那个函数。 混淆矩阵
两个指标: 1. 精确率 precisionn 2. 召回率 recall 3.F1-score 精确率:预测结果为正例样本中,真正为正例的比例
召回率: 真实为正例的样本中,预测结果为正例的比例
以癌症为例: 患癌症能够被检查出来的概率 —— 召回率
精确率和召回率都是越高越好
F1-score 反映模型稳健性
API:
report = classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"])
print(report)
样本不均衡时,需要使用这两个指标来看精确率和召回率的准确性。
TPR = TP/(TP+FN) - 召回率 FPR = FP/(FP+TN)
由FPR为横轴,TPR为纵轴构成的曲线,称为ROC曲线。
ROC曲线和轴组成的面积称为AUC指标
API: roc_auc_score(y_true, y_predict) y_true:每个样本真实类别,必须为0(反例),1(正例) 所以上面癌症的案例中,我们最后面使用np.where 这个进行了一次判断。
y_true = np.where(y_test > 3, 1, 0)
roc_auc_score(y_true, y_predict)
AUC只能用于评价二分类算法中,用于评价样本不均衡中的分类器性能。
from sklearn.externals import joblib
# 保存模型
# joblib.dump(estimator, "my_ridge.pkl")
# 加载模型
#estimator = joblib.load("my_ridge.pkl")
API: from sklearn.cluster import KMeans estimator = KMeans(n_clusters=3)
如果符合:“高内聚,低耦合”效果,则说明效果好 指内部距离最小化,外部距离最大化
bi本族群与外部族群点的距离,ai是内部族群点的平均值。 SCi 趋近1, 效果好, SCi趋近0,效果差。
API: silhouette_score(data_new, y_predict)
线性回归算法中的损失函数 loss_function=(y_predict - y_true)^2/总数
逻辑回归因为它是二分类算法,因此它不能
联系客服