经典机器学习模型-Logical Regression Model

tech2024-06-09  69

一、模型说明 模型属于有监督学习模型,同时也属于判别模型,适用于二分类/回归问题。 二、激活函数 1.sigmoid函数表达式 为了区别于线性回归模型引入该函数 2.sigmoid函数性质 (1)单调性:在定义域上函数单调递增 (2)定义域:X—>(-R,+R) (3)值域:Y—>(0,1) (4)导数性质: 三、模型原理 1.手撕公式 2.损失函数:交叉熵损失函数 3.根据梯度下降法求解 4. 防止过拟合 主要从模型损失函数出发加入正则,具体如下: 四、模型优缺点 逻辑回归是解决工业规模问题最流行的算法。在工业应用上,如果需要分类的数据拥有很多有意义的特征,每个特征都对最后的分类结果有或多或少的影响,那么最简单最有效的办法就是将这些特征线性加权,一起参与到决策过程中。比如预测广告的点击率,从原始数据集中筛选出符合某种要求的有用的子数据集等等。 1 .优点: (1)适合需要得到一个分类概率的场景。 (2)计算代价不高,容易理解实现。LR在时间和内存需求上相当高效。它可以应用于分布式数据,并且还有在线算法实现,用较少的资源处理大型数据。 (3)LR对于数据中小噪声的鲁棒性很好,并且不会受到轻微的多重共线性的特别影响。(严重的多重共线性则可以使用逻辑回归结合L2正则化来解决,但是若要得到一个简约模型,L2正则化并不是最好的选择,因为它建立的模型涵盖了全部的特征。) 2. 缺点: (1)容易欠拟合,分类精度不高。 (2)数据特征有缺失或者特征空间很大时表现效果并不好。

五、基于sklearn架构实现LR应用实例 项目描述:该项目主要实现乳腺癌分类 项目代码:

#导入模块 import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import pandas as pd import warnings import sklearn from sklearn.linear_model import LogisticRegressionCV,LinearRegression from sklearn.linear_model.coordinate_descent import ConvergenceWarning from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler ## 设置字符集,防止中文乱码 mpl.rcParams['font.sans-serif']=[u'simHei'] mpl.rcParams['axes.unicode_minus']=False ## 拦截异常 warnings.filterwarnings(action = 'ignore', category=ConvergenceWarning) ## 数据读取并处理异常数据(特征工程) path = "datas/breast-cancer-wisconsin.data" names = ['id','Clump Thickness','Uniformity of Cell Size','Uniformity of Cell Shape', 'Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei', 'Bland Chromatin','Normal Nucleoli','Mitoses','Class'] df = pd.read_csv(path, header=None,names=names) datas = df.replace('?', np.nan).dropna(how = 'any') # 只要有列为空,就进行删除操作 # 数据提取以及数据分隔 ## 提取 X = datas[names[1:10]] Y = datas[names[10]] ## 分隔 X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.1,random_state=0) # 数据格式化(归一化) ss = StandardScaler() X_train = ss.fit_transform(X_train) ## 训练模型及归一化数据 #模型构建 lr = LogisticRegressionCV(multi_class='ovr',fit_intercept=True, Cs=np.logspace(-2, 2, 20), cv=2, penalty='l2', solver='lbfgs', tol=0.01) ## penalty: 过拟合解决参数,l1或者l2 ## solver: 参数优化方式 ### 当penalty为l1的时候,参数只能是:liblinear(坐标轴下降法); ### nlbfgs和cg都是关于目标函数的二阶泰勒展开 ### 当penalty为l2的时候,参数可以是:lbfgs(拟牛顿法)、newton-cg(牛顿法变种),seg(minibatch) # 维度<10000时,lbfgs法比较好, 维度>10000时, cg法比较好,显卡计算的时候,lbfgs和cg都比seg快 ## multi_class: 分类方式参数;参数可选: ovr(默认)、multinomial;这两种方式在二元分类问题中,效果是一样的;在多元分类问题中,效果不一样 ### ovr: one-vs-rest, 对于多元分类的问题,先将其看做二元分类,分类完成后,再迭代对其中一类继续进行二元分类 ### multinomial: many-vs-many(MVM),即Softmax分类效果 ## class_weight: 特征权重参数 ### TODO: Logistic回归是一种分类算法,不能应用于回归中(也即是说对于传入模型的y值来讲,不能是float类型,必须是int类型) #模型训练 re=lr.fit(X_train, Y_train) # 4. 模型效果获取 r = re.score(X_train, Y_train) print ("R值(准确率):", r) print ("稀疏化特征比率:%.2f%%" % (np.mean(lr.coef_.ravel() == 0) * 100)) print ("参数:",re.coef_) print ("截距:",re.intercept_) print(re.predict_proba(X_test)) # 获取sigmoid函数返回的概率值 # # 模型相关信息保存 # ## 引入包 from sklearn.externals import joblib # ## 要求文件夹必须存在 joblib.dump(ss, "datas/logistic/ss.model") ## 将标准化模型保存 joblib.dump(lr, "datas/models/logistic/lr.model") ## 将模型保存 # # 模型加载 # ## 引入包 from sklearn.externals import joblib oss = joblib.load("models/logistic/ss.model") olr = joblib.load("models/logistic/lr.model") # 数据预测 ## a. 预测数据格式化(归一化) X_test = ss.transform(X_test) # 使用模型进行归一化操作 ## b. 结果数据预测 Y_predict = re.predict(X_test) ## 测试集结果预测 r = re.score(X_test, Y_test) print ("R值(准确率):", r)

训练集score达到97.1% 测试集score达到98.6%集合,几乎可以用于工业界。

最新回复(0)