目录
1.简介
2.应用范围
3.分类
3.应用条件
4.原理详解
4.1 sigmod分类函数
4.2 建立目标函数
4.3 求解相关参数
5.实列分析
5.1 导入库
5.2 读取数据(excel文件)
5.3 分离数据集
5.4 求解前设定
5.5 求解目标函数
5.6 预测
5.7 预测分类
5.8 准确率
6. python中sklearn函数
1.简介
Logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘 ,Logistic回归虽说是回归,但实际更属于判别分析。
2.应用范围
① 适用于流行病学资料的危险因素分析
② 实验室中药物的剂量-反应关系
③ 临床试验评价
④ 疾病的预后因素分析
3.分类
①按因变量的资料类型分:
二分类
多分类
其中二分较为常用
② 按研究方法分:
条 件Logistic回归
非条件Logistic回归
两者针对的资料类型不一样,前者针对配对研究,后者针对成组研究。
3.应用条件
① 独立性。各观测对象间是相互独立的;
② LogitP与自变量是线性关系;
③ 样本量。经验值是病例对照各50例以上或为自变量的5-10倍(以10倍为宜),不过随着统计技术和软件的发展,样本量较小或不能进行似然估计的情况下可采用精确logistic回归分析,此时要求分析变量不能太多,且变量分类不能太多;
④ 当队列资料进行logistic回归分析时,观察时间应该相同,否则需考虑观察时间的影响(建议用Poisson回归)。
4.原理详解
4.1 sigmod分类函数
之所以在这里介绍,是因为下面会用到这个函数
Sigmoid函数:
曲线表示:
由图可见当范围为0-1,当X<0时,Y趋向于0,X>0时,Y趋向于1,适合用于0-1二分类。
所以我们就可以设分类函数如下:
其中为自变量,即特征数据。实际因变量为,为0-1变量,为预测值范围为0-1。显然这个模型需要求解的变量为。
4.2 建立目标函数
对于输入变量,设为输出为1的概率,则为输出0的概率。则可表示成如下:
求解损失函数:用概率论中的极大似然估计的方法,构建概率函数如下,
对损失函数可以理解为,当时,的值越大,P的值越大;时,的值越小,P的值越小。即可以认为,当P值越大时预测的越准确。单个输入的目标即为P取最大。对M个输入样本,可以构建以下目标函数:
对目标函数取对数可以将目标函数的连乘变为连加:
4.3 求解相关参数
设,求的最大值,可以用梯度上升的方法进行求解,如果在前面加上一个负号,则就转化为梯度下降。在这里用梯度上升法求解系数 :
其中,为学习率。对目标函数求梯度、即求导。
其中:
将其带入原式可得:
5.实列分析
相关数据如下:
fbs | restecg | thalach | exang | 0ldpeak | sl0pe | ca | thal | target |
0 | 1 | 168 | 0 | 1 | 2 | 2 | 3 | 0 |
1 | 0 | 155 | 1 | 3.1 | 0 | 0 | 3 | 0 |
0 | 1 | 125 | 1 | 2.6 | 0 | 0 | 3 | 0 |
0 | 1 | 161 | 0 | 0 | 2 | 1 | 3 | 0 |
1 | 1 | 106 | 0 | 1.9 | 1 | 3 | 2 | 0 |
0 | 0 | 122 | 0 | 1 | 1 | 0 | 2 | 1 |
0 | 2 | 140 | 0 | 4.4 | 0 | 3 | 1 | 0 |
0 | 0 | 145 | 1 | 0.8 | 1 | 1 | 3 | 0 |
0 | 0 | 144 | 0 | 0.8 | 2 | 0 | 3 | 0 |
0 | 0 | 116 | 1 | 3.2 | 1 | 2 | 2 | 0 |
0 | 1 | 125 | 0 | 1.6 | 1 | 0 | 2 | 1 |
1 | 0 | 136 | 1 | 3 | 1 | 0 | 3 | 0 |
5.1 导入库
#导入相关库
import pandas as pd
import numpy as np
5.2 读取数据(excel文件)
#导入数据
data=pd.read_excel('D:\桌面\data.xlsx')
# print(data)
#提取变量名 x1 -- x7
label_need=data.keys()[0:]
# print(label_need)
#提取上面变量名下的数据
data1=data[label_need].values
print(data1)
返回:
5.3 分离数据集
正式介绍之前补充一点东西
行数 = np.shape(data)[0]
列数 = np.shape(data)[1]
好,开始进入正题
此为通过比例确定,选择多少行数据作为测试集
num=round(0.8*np.shape(data)[0]) #取整个数据0.8的比例训练
选出相应比例的数据作为测试集
train_data=data1[0:num,:]
将剩余数据作为验证集
test_data=data1[num:,:]
分离测试集的x和y
n=np.shape(data1)[1]
train_y=train_data[:,n-1] #确定y所对应的数据
train_x=train_data[:,:n-2] #除去y将剩余的数据都归于x
同理分离验证集的x和y
test_y=test_data[:,n-1]
test_x=test_data[:,:n-2]
5.4 求解前设定
详看上面过程公式4.1的分类函数的解析
new1 = np.ones((np.shape(train_x)[0]))
new2 = np.ones((np.shape(test_x)[0]))
train_x1=np.insert(train_x,0,values=new1,axis=1)
test_x1=np.insert(test_x,0,values=new2,axis=1)
w=np.zeros((np.shape(test_x1)[1],1))
lr=0.001 #学习率
5.5 求解目标函数
pred_f= np.dot(train_x1,w) #预测出的方程式取值
pred_y=1./(1+np.exp(-pred_f)) #Sigmoid函数
d_w=(np.dot((train_y-pred_y).T,train_x1))
w=w+np.dot(lr,d_w.T)
w=np.mean(w,axis=1)
返回,可查得w为:
5.6 预测
pred_y=1/(1+np.exp(-np.dot(test_x1,w))) #预测出分类的p值
返回:
5.7 预测分类
fenlei=1*(pred_y>=0.5)
返回:
5.8 准确率
accu=1-sum(np.abs(fenlei-test_y))/len(test_y)
返回:
6. python中sklearn函数
LogisticRegression 可看文档:传送门
调用:
from sklearn.linear_model import LogisticRegression
对上面数据再次拟合
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier.fit(train_x, train_y)
y_pred = classifier.predict(test_x)
返回:
函数参数:
LogisticRegression
(penalty=’l2’, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, rando
m_state=None, solver=’liblinear’, max_iter=100, multi_class=’ovr’, verbose=0, warm_start=False, n_jobs=1)[source]
(1)在多类别划分中,如果' multi_class '选项设置为' OvR ',训练算法将使用one-vs-rest (OvR)方案;如果' multi_class '选项设置为'多项式',则使用交叉熵损失。
(2)这个类使用‘liblinear’ library, ‘newton-cg’, ‘sag’ 和‘lbfgs’求解器实现了规范化的logistic回归。它的输入矩阵可以是密集和稀疏的矩阵;使用C-ordered arrays or CSR matrices containing 64-bit floats可以获得最佳的性能;
(3)‘newton-cg’, ‘sag’, and ‘lbfgs求解器只支持原始公式下的L2正则化;liblinear求解器同时支持L1和L2的正则化,只对L2处罚采用对偶公式。
- penalty : str, ‘l1’ or ‘l2’, default: ‘l2’。用来指明惩罚的标准,The ‘newton-cg’, ‘sag’ and ‘lbfgs’ solvers仅支持l2 penalties.
- dual : bool, default: False。Dual or primal formulation.Dual formulation只适用于 l2 penalty with liblinear solver.Prefer dual=False when n_samples > n_features.
- tol : float, default: 1-4。Tolerance for stopping criteria.
- C : float, default: 1.0。逆正则化的强度,一定要是整数,就像支持向量机一样,较小的值有职责更好的正则化。
- fit_intercept : bool, default: True。是否存在截距,默认存在。
- class_weight : dict or ‘balanced’, default: None。用于标示分类模型中各种类型的权重,可以不输入,即不考虑权重。如果输入的话可以调用balanced库计算权重,或者是手动输入各类的权重。比如对于0,1的二元模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。
- random_state:随机数种子,默认为无,仅在正则化优化算法为sag,liblinear时有用。
- max_iter : int, default: 100。Useful only for the newton-cg, sag and lbfgs solvers,求解的最大迭代次数
- multi_class : str, {‘ovr’, ‘multinomial’}, default: ‘ovr’。多类别问题的处理方式。'ovo':一对一
- verbose :日志冗长度int:冗长度;0:不输出训练过程;1:偶尔输出; >1:对每个子模型都输出
- warm_start : bool, default: False。是否热启动,如果是,则下一次训练是以追加树的形式进行(重新使用上一次的调用作为初始化),bool:热启动,False:默认值
- n_jobs:并行数,int:个数;-1:跟CPU核数一致;1:默认值
- solver : {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’},default: ‘liblinear’ Algorithm to use in the optimization problem.
- 对于小的数据集,, 选择 ‘liblinear’较好,‘sag’ 和‘saga’ 对于大数据集更好;
- 对于多级分类的问题,只有‘newton-cg’, ‘sag’, ‘saga’ and ‘lbfgs’,libniear只支持多元逻辑回归的OvR,不支持MvM,但MVM相对精确。
- newton-cg’, ‘lbfgs’ and ‘sag’ only handle L2 penalty, 相反地‘liblinear’ and ‘saga’ handle L1 penalty.
本次就到这里了,如果有错误的话及时联系我进行改正哦,谢谢。