回归问题:
目标值 - 连续型的数据
线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。
特点:只有一个自变量的情况称为单变量回归,大于一个自变量情况的叫做多元回归
线性关系:
y = w1x1 + w2x2 + w3x3 + …… + wnxn + b
= wTx + b
数据挖掘基础
y = kx + b
y = w1x1 + w2x2 + b
y = 0.7x1 + 0.3x2
期末成绩:0.7×考试成绩+0.3×平时成绩
[[90, 85],
[]]
[[0.3],
[0.7]]
[8, 2] * [2, 1] = [8, 1]
广义线性模型
非线性关系?
线性模型
自变量一次
y = w1x1 + w2x2 + w3x3 + …… + wnxn + b
参数一次
y = w1x1 + w2x1^2 + w3x1^3 + w4x2^3 + …… + b
线性关系一定是线性模型
线性模型不一定是线性关系
目标:求模型参数
模型参数能够使得预测准确
真实关系:真实房子价格 = 0.02×中心区域的距离 + 0.04×城市一氧化氮浓度 + (-0.12×自住房平均房价) + 0.254×城镇犯罪率
随意假定:预测房子价格 = 0.25×中心区域的距离 + 0.14×城市一氧化氮浓度 + 0.42×自住房平均房价 + 0.34×城镇犯罪率
损失函数/cost/成本函数/目标函数:0
最小二乘(平方)法
优化损失
优化方法?
正规方程
天才 - 直接求解W
拓展:
1)
y = ax^2 + bx + c
y’ = 2ax + b = 0
x = - b / 2a
2)
a * b = 1
b = 1 / a = a ^ -1
A * B = E
[[1, 0, 0],
[0, 1, 0],
[0, 0, 1]]
B = A ^ -1
梯度下降
勤奋努力的普通人
不断试错、改进
- sklearn.linear_model.LinearRegression(fit_intercept=True)
- 通过正规方程优化
- fit_intercept:是否计算偏置
- LinearRegression.coef_:回归系数
- LinearRegression.intercept_:偏置
- sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='invscaling', eta0=0.01)
- SGDRegressor类实现了随机梯度下降学习,它支持不同的**loss函数和正则化惩罚项**来拟合线性回归模型。
- loss:损失类型
- **loss=”squared_loss”: 普通最小二乘法**
- fit_intercept:是否计算偏置
- learning_rate : string, optional
- 学习率填充
- 'constant': eta = eta0
- 'optimal': eta = 1.0 / (alpha \* (t + t0)) [default]
- 'invscaling': eta = eta0 / pow(t, power_t)
- power_t=0.25:存在父类当中
- 对于一个常数值的学习率来说,可以使用learning_rate=’constant’ ,并使用eta0来指定学习率。
- SGDRegressor.coef_:回归系数
- SGDRegressor.intercept_:偏置
流程:
1)获取数据集
2)划分数据集
3)特征工程:
无量纲化 - 标准化
4)预估器流程
fit() --> 模型
coef_ intercept_
5)模型评估
回归的性能评估:
均方误差
4 正规方程和梯度下降对比
训练集上表现得好,测试集上不好 - 过拟合
欠拟合
学习到数据的特征过少
解决:
增加数据的特征数量
过拟合
原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点
解决:
正则化
L1
损失函数 + λ惩罚项
LASSO
L2 更常用
损失函数 + λ惩罚项
Ridge - 岭回归
岭回归,其实也是一种线性回归。只不过在算法建立回归方程时候,加上正则化的限制,从而达到解决过拟合的效果
All last four solvers support both dense and sparse data. However, only 'sag' supports sparse input when `fit_intercept` is True.
class _BaseRidgeCV(LinearModel):
def __init__(self, alphas=(0.1, 1.0, 10.0),
fit_intercept=True, normalize=False, scoring=None,
cv=None, gcv_mode=None,
store_cv_values=False):
正则化力度越大,权重系数会越小
正则化力度越小,权重系数会越大
广告点击率 - 是否会被点击
是否为垃圾邮件
是否患病
是否为金融诈骗
是否为虚假账号
正例 / 反例
线性回归的输出 就是 逻辑回归 的 输入
激活函数:
sigmoid函数 [0, 1]
1/(1 + e^(-x))
逻辑回归最终的分类是通过属于某个类别的概率值来判断是否属于某个类别,并且这个类别默认标记为1(正例),另外的一个类别会标记为0(反例)。(方便损失计算)
假设函数/线性模型
1/(1 + e^(-(w1x1 + w2x2 + w3x3 + …… + wnxn + b)))
损失函数:
(y_predict - y_true)平方和/总数
逻辑回归的真实值/预测值:是否属于某个类别
对数似然损失
log 2 x
优化损失
梯度下降
默认将类别数量少的当做正例
LogisticRegression方法相当于 SGDClassifier(loss=“log”, penalty=" "),SGDClassifier实现了一个普通的随机梯度下降学习,也支持平均随机梯度下降法(ASGD),可以通过设置average=True。而使用LogisticRegression(实现了SAG)
恶性 - 正例
流程分析:
1)获取数据
读取的时候加上names
2)数据处理
处理缺失值
3)数据集划分
4)特征工程:
无量纲化处理-标准化
5)逻辑回归预估器
6)模型评估
真的患癌症的,能够被检查出来的概率 - 召回率
TP = True Possitive 真正例
FN = False Negative 伪反例
精确率:预测的正例之中真正为正例的比例
召回率 查得全不全 :真正的正例之中预测为正例的比例
工厂 质量检测 次品 召回率
例1:总共有100个人,如果99个样本癌症,1个样本非癌症 - 样本不均衡
不管怎样我全都预测正例(默认癌症为正例) - 不负责任的模型
准确率:99%
召回率:99/99 = 100%
精确率:99%
F1-score: 2*99%/ 199% = 99.497%
例子中的AUC:0.5
TPR = 100%
FPR = 1 / 1 = 100%
TPR = TP / (TP + FN) - 召回率
所有真实类别为1的样本中,预测类别为1的比例
FPR = FP / (FP + TN)
所有真实类别为0的样本中,预测类别为1的比例
最终AUC的范围在[0.5, 1]之间,并且越接近1越好
# 0.5~1之间,越接近于1约好
y_test = np.where(y_test > 2.5, 1, 0)
print("AUC指标:", roc_auc_score(y_test, lr.predict(x_test)))
当训练或者计算好一个模型之后,那么如果别人需要我们提供结果预测,就需要保存模型(主要是保存算法的参数)
# 使用线性模型进行预测
# 使用正规方程求解
lr = LinearRegression()
# 此时在干什么?
lr.fit(x_train, y_train)
# 保存训练完结束的模型
joblib.dump(lr, "test.pkl")
# 通过已有的模型去预测房价
model = joblib.load("test.pkl")
print("从文件加载进来的模型预测房价的结果:", std_y.inverse_transform(model.predict(x_test)))
没有目标值 - 无监督学习
聚类
K-means(K均值聚类)
降维
k = 3
流程分析:
降维之后的数据
1)预估器流程
2)看结果
3)模型评估
轮廓系数
如果b_i>>a_i:趋近于1效果越好,
b_i<
越趋近于1代表内聚度和分离度都相对较优。
应用场景:
没有目标值
分类