回归算法分析和非监督学习

tech2023-10-19  101

机器学习笔记三

机器学习算法回归算法分析矩阵线性回归(迭代的算法)回归性能评估过拟合和欠拟合岭回归模型的保存和加载回归算法实例分类算法-逻辑回归朴素贝叶斯和逻辑回归对比损失函数对比 -- 梯度下降求解非监督学习-聚类算法-kmeans

机器学习算法

回归算法分析

分类和回归问题区别 回归 目标值连续 分类 离散型数据 回归应用 房价预测销售额的预测贷款额度预测 线性回归

寻找一种能够预测的趋势

线性关系

二维:直线关系三维:特征和目标值,在一个平面当中

线性关系定义

一个特征 y = kx +bb : 偏置 为了使对单个特征的情况更加通用 多个特征 y = W1* X1 + W2*X2 + … + WaXa + b W:权重b: 偏置项

线性回归定义:特征和目标值之间进行建模的回归分析

矩阵

矩阵: 大多数算法的计算基础

数组和矩阵的区别

数组: 可以是0维 1维 2维 3维 等数组运算 加减乘除 矩阵 必须是2维的满足了一些的特定的运算需求

矩阵运算

矩阵相乘 (m行,l列)*(l行,n列) = (m行,n列)np.dot() In [2]: import numpy as np In [3]: a = [[1,2,3,4,],[2,3,7,9]] In [4]: b = [2,2,2,2] In [6]: np.multiply(a,b) # 数组运算 Out[6]: array([[ 2, 4, 6, 8], [ 4, 6, 14, 18]]) In [7]: b = [[2],[2],[2],[2]] In [8]: np.dot(a,b) Out[8]: array([[20], [42]])

线性回归(迭代的算法)

回归

知道误差,就去不断减少误差

迭代的过程

算法策略(损失函数)优化

策略(损失函数)

最小二乘法所有 的(预测值 - 实际值)^2 的和就是误差误差平方和

优化

寻找最优的W值使得损失函数最小求W的方法 正规方程 数据复杂的时候很难求到 梯度下降 影响因素: 学习率

API

正规方程 sklearn.linear_model.LinearRegression 回归系数(权重) coef_ 普通最小二乘线性回归 梯度下降 sklearn.linear_model.SGDRegressor coef_ 通过使用SGD最小化线性模型 容易出现过拟合 使用正则化 岭回归

scikit-learn的优缺点

优点 封装好,建立模型简单,预测简单 缺点 算法的过程,有写参数都字啊算法API内部优化,参数难找 tensorflow: 封装高低,自己实现线性回归,学习率什么的都可以自己指定,过程可以看到

线性回归需要做标准化处理

正规方程和梯度下降对比

梯度下降 需要学习率需要多次迭代适用于特征量大的实例适用于各种类型的模型 正规方程 不需要学习率一次运算得出结果特征量少的时候用的多,一般特征小于10000时使用一般只用在特征量少的线性模型不能解决你和问题

回归性能评估

使用均方误差API sklearn.metrics.mean_squared_error 参数 测试数据预测的目标值测试数据实际的目标值

过拟合和欠拟合

问题

训练数据训练的很好,但是在测试数据中不是很好

过拟合

学习的东西太多训练集比较好,测试集不好模型过于复杂原因 原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型兼顾各个测试数据点 解决办法 特征选择,消除关联大的特征(比较难)交叉验证(让所有数据都有过训练) - 检验出正则化(了解) 尽量减少高次项的权重岭回归-带有正则化

欠拟合

学习的东西太少训练集和测试集数据误差都大模型过于简单原因 学习数据的特征过少 解决方法 增加数据的特征数量

模型复杂的原因

原因: 数据的特征和目标值之间不仅仅是线性关系

判断方法

看交叉验证训练集的结果和测试集的结果欠拟合 训练集结果和测试集结果都不行 过拟合 训练集结果很好,测试集下降幅度大

回归解决过拟合

L2正则化: Ridge:岭回归,带有正则化的线性回归

岭回归

带有正则化的回归 解决过拟合 API sklearn.linear_model.Ridge(alpha=1.0) 参数 alpha: 正则化力度(超参数) 取值范围 0-1之间/1-10之间 coef_: 回归系数 正则化力度对结果的影响 力度越来越大,权重越来越小,模型越来越简单 优势 回归更符合实际,更可靠在异常数据较多的时候使用岭回归 alpha超参数可以使用网格搜索来进行对数据的优化

模型的保存和加载

将训练好的模型储存起来,再后在直接加载使用模块 from sklearn.externals import joblib 0.8版本 最新版本中直接导入joblib使用 import joblib 保存 joblib.dump(实例化的模型,“文件名.pkl”) 加载 joblib.load(“文件名.pkl”)

回归算法实例

线性回归:正规方程、梯度下降、岭回归、模型保存和加载 波士顿房价预测# coding=utf-8 # 回归数据集 波士顿房价 from sklearn.datasets import load_boston # 标准化处理 from sklearn.preprocessing import StandardScaler # 线性回归 正规方程 梯度下降 岭回归 from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge # 数据分隔 from sklearn.model_selection import train_test_split # 算法衡量 均方误差 from sklearn.metrics import mean_squared_error # 导入保存模型 import joblib def linear_regression(x_train, x_test, y_train, y_test, std_y): """ 正规方程 :param x_train: :param x_test: :param y_train: :param y_test: :return:None """ print("正规方程") # 实例化 lr = LinearRegression() # 输入数据 lr.fit(x_train, y_train) # 权重 print("回归系数:") print(lr.coef_) # 预测 测试集的房子价格 # 标准化转换成真实的房子的价格 inverse_transform y_predict = std_y.inverse_transform(lr.predict(x_test)) print("测试集中的预测房价:\n", y_predict) print("均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_predict)) print("*" * 50) return None def SGD(x_train, x_test, y_train, y_test, std_y): """ 梯度下降预测房价 :param x_train: :param x_test: :param y_train: :param y_test: :param std_y: :return: """ print("梯度下降") # 实例化 sgd = SGDRegressor() # 输入数据 将y_train转换成一维数据 sgd.fit(x_train, y_train.ravel()) # 权重 print("回归系数:") print(sgd.coef_) # 预测 测试集的房子价格 # 标准化转换成真实的房子的价格 inverse_transform y_predict = std_y.inverse_transform(sgd.predict(x_test)) print("测试集中的预测房价:\n", y_predict) print("均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_predict)) print("*" * 50) return None def ridge(x_train, x_test, y_train, y_test, std_y): """ 岭回归,预测房价 :param x_train: :param x_test: :param y_train: :param y_test: :param std_y: :return: None """ print("岭回归") # 实例化岭回归 rd = Ridge(alpha=1.0) # 输入数据 将y_train转换成一维数据 rd.fit(x_train, y_train.ravel()) # 权重 print("回归系数:") print(rd.coef_) # 预测 测试集的房子价格 # 标准化转换成真实的房子的价格 inverse_transform y_predict = std_y.inverse_transform(rd.predict(x_test)) print("测试集中的预测房价:\n", y_predict) print("均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_predict)) # 保存模型 # joblib.dump(rd,"../file/models/test.pkl") # 加载模型 model = joblib.load("../file/models/test.pkl") # 使用模型 model_y_predict = std_y.inverse_transform(model.predict(x_test)) print("训练模型测试集中的预测房价:\n", model_y_predict) print("均方误差:", mean_squared_error(std_y.inverse_transform(y_test), model_y_predict)) return None 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) # print(y_train,y_test) # 一维数据 # 进行标准化处理 目标值也要标准化处理 # 特征值和目标值都要进行处理 需要实例化两个标准化 # 特征值 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.fit_transform(y_test.reshape(-1, 1)) # estimator 预测 # 正规方程 linear_regression(x_train, x_test, y_train, y_test, std_y) # 梯度下降 SGD(x_train, x_test, y_train, y_test, std_y) # 岭回归 ridge(x_train, x_test, y_train, y_test, std_y) return None if __name__ == '__main__': mylinear()

分类算法-逻辑回归

应用场景 一般应用于二分类中使用广告点击率是否为垃圾邮件是否患病金融诈骗虚假账号 得出具体的概率输入 与线性回归的输入一样 会出现的问题 过拟合 sigmoid函数 将数据转换到 0-1 之间输出将输入转换成概率值g(z)=1/(1+e^(-z)) e:2.71z:回归的结果 策略(损失函数) 对数似然函数 y=1 (-log(h(x))) y=0 (-log(1-h(x))) 梯度下降求解 优化API - 自带正则化 sklearn.linera_model.LogisticRegression 参数 penalty 正则化 C 正则化力度 评估方法 召回率 判定规则 哪一个类别少,判定概率值是指的这个类别,则:概率小的为正例 总结 优点 得到一个分类概率的场景,简单,速度快 缺点 不好处理多分类问题 多分类使用 softmax方法实例 癌症预测# coding=utf-8 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 def logistic(): """ 逻辑回归做二分类进行癌症预测(根据属性特征) :return:None """ # 指定数据中每一列标签名 column = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape', 'MarginalAdhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'BlandChromatin', '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) # 进行缺失值的处理 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]]) # 进行标准化处理 std = StandardScaler() # 只将特征值标准化 x_train = std.fit_transform(x_train) x_test = std.transform(x_test) # 逻辑回归预测 lg = LogisticRegression(C=1.0) lg.fit(x_train,y_train) y_predict = lg.predict(x_test) print("系数:",lg.coef_) print("准确率:",lg.score(x_test,y_test)) print("召回率:",classification_report(y_test, y_predict,target_names=["良性","恶性"], labels=[2,4])) return None if __name__ == '__main__': logistic()

朴素贝叶斯和逻辑回归对比

逻辑回归 解决问题 二分类 应用场景 二分类问题(需要概率) 参数 正则化力度 判别模型 朴素贝叶斯 解决问题 多分类(一般为文本分类) 应用场景 文本分类 参数 没有参数 生成模型 共同点 得出的结果都有概率解释 生成模型和判别模型 生成模型 朴素贝叶斯隐马尔科夫模型 判别模型 K-近邻决策树随机森林神经网路 判别依据 有没有先验概率先验概率 是否需要在历史数据中总结出概率信息

损失函数对比 – 梯度下降求解

均方误差 不存在多个局部最低点,只有一个最小值 对数似然 有多个局部最小值 目前解决不了的问题,很难找到整个的最低点-只能尽量改善 尽管没有全局最低点,但是效果都是不错的 解决多个局部最小值的方法(不能确保解决-只是尽量改善) 多次随机初始化,多次比较最小值结果求解过程中调整学习率

非监督学习-聚类算法-kmeans

非监督学习聚类算法 k-means k将数据划分成多少个类别一般是知道的如果不知道就作为超参数 步骤 随机在样本数据中抽取k个样本,当做三个类别的中心点计算其余点分别到这k个中心点的距离,每一个样本有K个距离,从中选取距离最近的点作为自己的标记形成k个族群分别计算这k个族群的平均值,把K个平均值与之前的K个就的中心点进行比较 如果相同 结束聚类 如果不同 把这K个平均值当做新的中心点,重复第二步 API sklearn.cluster.KMeans() 参数 n_clusters:开始的聚类中心点数量init:初始化方法,默认为k-means++labels_:默认标记类型,可以和真实值比较(不是值比较) 聚类 一般做在分类之前 实例在jupyter notebook上 7.评估 轮廓系数 [-1,1] 之间距离1越近越好 API sklearn.metrics.silhouette_score(X,labels) 参数 X:特征值labels:被聚类标记的目标值 总结 特点 采用迭代算法,直观易懂并且实用 缺点 容易收敛到局部最优解(多次取值进行聚类) 注意 聚类一般做在分类之前 实例 用户对物品类别的喜好 数据集 #!/usr/bin/env python # coding: utf-8 # In[27]: import pandas as pd # 主成分分析 from sklearn.decomposition import PCA # 聚类 from sklearn.cluster import KMeans # 聚类评估 from sklearn.metrics import silhouette_score import matplotlib.pyplot as plt # 读取四张表的数据 # In[2]: prior = pd.read_csv("./order_products__prior.csv") # In[3]: products = pd.read_csv("./products.csv") # In[4]: orders = pd.read_csv("./orders.csv") # In[5]: aisles = pd.read_csv("./aisles.csv") # 合并四张表到一项表 (用户_物品类别) # In[6]: _mg = pd.merge(prior,products,on=["product_id","product_id"]) _mg = pd.merge(_mg,orders,on=["order_id","order_id"]) mt = pd.merge(_mg,aisles,on=["aisle_id","aisle_id"]) # In[7]: mt.head(10) # 建立一个类似行,类数据 交叉表(特殊的分组) 行:用户id:物品 的个数 # In[8]: cross = pd.crosstab(mt["user_id"],mt["aisle"]) # In[9]: cross.head(10) # 进行主成分分析 # In[10]: pca = PCA(n_components=0.9) # In[11]: data = pca.fit_transform(cross) # In[15]: data.shape # 将数据减少 # In[16]: x = data[:500] x.shape # 聚类使用 # 假设用户一共分为4个类别 # In[17]: # 实例化 km = KMeans(n_clusters=4) # In[18]: # 输入数据 km.fit(x) # In[19]: # 进行预测 标记 predict = km.predict(x) # In[20]: predict # In[23]: # 显示聚类的结果 plt.figure(figsize=(10,10)) # In[25]: # 建立四个颜色列表 colors = ["green","orange","blue","cyan"] # 遍历 colr = [colors[i] for i in predict] # 画图 plt.scatter(x[:,1],x[:,20],color=colr) # 描述 plt.xlabel("1") plt.ylabel("20") # 显示 plt.show() # In[28]: # 评判聚类效果,轮廓系数 silhouette_score(x,predict) # In[ ]:
最新回复(0)