1. 线性回归的计算和矩阵计算
- 线性关系:
- 线性关系模型:
- 以权重和特征去预测结果
- 矩阵必须是二维的
2. 线性回归策略优化
- 损失函数(最小二乘法):
- 最小二乘法之梯度下降
- 线性回归正规方程、梯度下降API:
其中梯度下降虽然需要参数,但是在这个API中可以不写(默认) - 回归性能评估
均方误差的API:
- 实例:
# 导入相关模块 from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import SGDRegressor, LinearRegression from sklearn.metrics import mean_squared_error # 获取数据 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)) def lreg(): # 正规方程求解预测结果 lr = LinearRegression() lr.fit(x_train, y_train) # 预测得到的直接结果是标准化之后的结果,要进行逆变换 p_y_test = std_y.inverse_transform(lr.predict(x_test)) print("线性回归正规方程权重矩阵为:", "\n", lr.coef_) print("线性回归正规方程预测测试集房价为:", "\n", p_y_test) return p_y_test def sgdreg(): # 梯度下降求解预测结果 sgd = SGDRegressor() sgd.fit(x_train, y_train) # 预测得到的直接结果是标准化之后的结果,要进行逆变换 p_y_test = std_y.inverse_transform(sgd.predict(x_test)) print("线性回归梯度下降权重矩阵为:", "\n", sgd.coef_) print("线性回归梯度下降预测测试集房价为:", "\n", p_y_test) return p_y_test sgd_y = sgdreg() line_y = lreg() # 使用梯度下降和正规方程返回的数据类型其实不是一致的 print("两者的预测偏差:", "\n", sgd_y-line_y[0]) mse_sgd = mean_squared_error(std_y.inverse_transform(y_test), sgd_y) mse_line = mean_squared_error(std_y.inverse_transform(y_test), line_y) print("正规方程的预测误差是:", "\n", mse_line) print("梯度下降的预测误差是:", "\n", mse_sgd)
- 算法选择
- 对比
3. 过拟合和欠拟合
- 图示:
- 对线性模型进行训练学习会变成复杂模型,也就是模型变复杂的原因在于数据的特征值和目标值之间不只是线性关系。
- 对于欠拟合,可以采取增加特征数量的方法
- 对于过拟合:
进行特征选择,消除关联性大的特征(很难做)
交叉验证(让所有数据都有过训练)
正则化(了解) - 特征选择:
过滤式:低方差
嵌入式:决策树、正则化、神经网络 - 正则化解决过拟合-----L2正则化
作用:可以使得W的每个元素都很小,都接近于0
优点:越小的参数说明模型越简单,越简单的模型则越不
容易产生过拟合现象
4. 带有正则化的线性回归—岭回归Ridge
- API
- 超参数正则化力度的分析
正则化力度取值,0~1或者1~10 - 线性回归和岭回归的对比:
5. 模型的保存和提取
- API:
6. 逻辑回归
- 线性回归的公式作为逻辑回归的输入,逻辑回归智能解决二分类问题,也能得出概率值。也会有线性回归的过拟合问题,但是在sklearn中的API引入了正则化。
- sigmoid函数:输出为一个概率值
- 逻辑回归公式
- 逻辑回归的损失函数(对数似然损失)
- 逻辑回归的API:
- 哪个类别比例少,一般选择该类别作为逻辑回归的判定类别。
- 实例演示:
# 导入相关模块 import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report # 获取数据,read_csv是万能接口 col_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("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data", # names=col_name) data = pd.read_csv("breast-cancer-wisconsin.data", names=col_name) print(data) # 数据预处理:处理缺失值(删除)、数据标准化 # 缺失值是问号,要将其替换成numpy中的nan,数据.replace返回的是替换之后的数据 data = data.replace(to_replace="?", value=np.nan) data = data.dropna() # 数据筛选(列表切片) data_x = data[col_name[1:10]] data_y = data[col_name[10]] # 数据标准化 ssc = StandardScaler() data_x = ssc.fit_transform(data_x) # 测试集和训练集分割 x_train, x_test, y_train, y_test= train_test_split(data_x, data_y) # 利用逻辑回归进行预测 lr = LogisticRegression() lr.fit(x_train, y_train) p_test = lr.predict(x_test) # 使用相关参数进行模型的评估 print("精确度和召回率分别是:\n", classification_report(y_test,p_test,labels=[2,4],target_names=["benign","malignant"]))
7. 损失函数
- 对数似然损失:存在局部最小的限制,也是梯度下降的方法的缺点,有以下两种减轻该限制的方法。
- 多次随机触发去找,最后再比较。
- 在求解得过程中调整学习率,
- 均分误差不存在局部最小的限制,最后可以求出最小的局部最小。
8. 分类回归总结
9. 非监督学习 - - - 聚类
- 聚类:k-means
- 对于不只到需要划分的类别个数,则类别个数就是一个超参数,一般聚类用在分类之前。
- 聚类步骤
1、随机设置K个特征空间内的点作为初始的聚类中心
2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类
中心点作为标记类别
3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平
均值)
4、如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行
第二步过程 - k-means聚类的API:
- 聚类的性能评估指标