过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
原因:原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点,数据的特征和目标值之间不仅仅是线性关系
解决办法:
回忆一下特征选择方法:
作用:可以使得W的每个元素都很小,都接近于0
优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象
线性回归:LinearRegression 容易出现过拟合,为了把训练接数据表现更好
L2正则化:Ridge:岭回归 带有正则化的线性回归 解决过拟合
sklearn.linear_model.Ridge
具有l2正则化的线性最小二乘法
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
def mylinear():
"""
线性回归直接预测房子价格
:return: None
"""
# 获取数据
lb = load_boston()
# 分割数据集到训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
# 进行标准化处理(目标值要进行标准化处理)
# 特征值和目标值都必须进行标准化处理, 实例化两个标准化API
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))
# estimator预测
# 岭回归去进行房价预测
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))
if __name__ == "__main__":
mylinear()
岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研究中有较大的实用价值。
逻辑回归:线性回归的式子作为逻辑回归的输入,适用于二分类场景,他也能得出概率值
输入:
逻辑回归的输入-sigmoid→分类
sigmodid函数会把值映射到[0, 1],也就是把我们的输入值转换成一个概率值
公式:
输出:[0,1]区间的概率值,默认0.5作为阀值
注:g(z)为sigmoid函数
与线性回归原理相同,但由于是分类问题,损失函数不一样,只能通过梯度下降求解
对数似然损失函数:
损失函数:
对数似然损失求出来的不一定是总函数的最小值,目前还是一个解决不了的问题,但是我们可以采取一些方案去尽量改善:
尽管没有全局最低点,但是效果都是不错的
sklearn.linear_model.LogisticRegression
sklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0)
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, classification_report
import joblib
import pandas as pd
import numpy as np
import ssl
def logistic():
"""
良/恶性乳腺癌肿瘤预测
原始数据的下载地址:
https://archive.ics.uci.edu/ml/machine-learning-databases/
逻辑回归做二分类进行癌症预测(根据细胞的属性特征)
:return: None
"""
ssl._create_default_https_context = ssl._create_unverified_context
# 构造列标签名字
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)
# 缺失值进行处理(替换“?”为nan)
data = data.replace(to_replace='?', value=np.nan)
#直接删除掉nan
data = data.dropna()
# 进行数据的分割
x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]], test_size=0.25)
# 进行标准化处理
std = StandardScaler()
#训练数据标准化
x_train = std.fit_transform(x_train)
# 测试数据标准化
x_test = std.transform(x_test)
# 逻辑回归预测 # 默认使用L2正则化避免过拟合,C=1.0表示正则力度(超参数,可以调参调优)
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=["良性", "恶性"]))
return None
if __name__ == "__main__":
logistic()
应用:广告点击率预测、电商购物搭配推荐
优点:适合需要得到一个分类概率的场景
缺点:当特征空间很大时,逻辑回归的性能不是很好(看硬件能力)
先验概率:从历史的数据中总结出概率信息。
需要进行先验概率的模型就是生成模型。
判别模型:k-近邻,决策树,随机森林,神经网络
生成模型:朴素贝叶斯,隐马尔可夫模型
逻辑回归 | 朴素贝叶斯 | |
---|---|---|
解决问题 | 二分类 | 多分类 |
应用场景 | 二分类需要概率的问题 | 文本分类 |
参数 | 正则化力度 | 没有 |
参考地址:https://www.jianshu.com/p/8b802d24eb39