我总感觉csdn里面编辑文本怪怪的,比如上下箭头按键不好用、backspace键删除一行不好用、ie浏览器里出现奇怪的文本框、时不时出现键入位置偏移之类的奇怪错误,可能是我电脑的原因,下回换个电脑试一下。但总之就我码了这么多博客(虽然总共没码多少字)的经验来说,csdn的用户写作体验绝对是差评、差评、差评。
逻辑回归与线性回归的联系与区别
线性回归是用于回归问题,y是连续值;
逻辑回归是用于分类问题,y是离散值。
逻辑回归模型在线性模型基础上套了一个函数把连续值转为离散值。
逻辑回归原理
逻辑回归损失函数
正则化
模型评估指标
衡量模型泛化能力的评价标准——性能度量(performance measure)
回归问题
均方误差 mean squared error
所有样本的预测值与真实值的差的平方的平均值
分类问题
错误率:分错了的样本数占样本总数的比例
精度:分对的样本数占样本总数的比例
它俩加起来等于1。
混淆矩阵 confusion matrix
预测类别1 | 预测类别0 | |
真实类别是1 | true positive | false negative |
真实类别是0 | false positive | true negative |
查准率 precision:在所有预测为1的样本里,有多少比例真的是1
查全率 recall:在所有真的为1的样本里,有多少被成功预测出来是1了
通常P和R是一对矛盾的度量。
逻辑回归优缺点
优点:
预测结果是介于0和1之间的概率;可适用于连续性和类别性自变量;容易使用和解释。
缺点:
1)对模型中自变量多重共线性较为敏感,例如两个高度相关自变量同时放入模型,可能导致较弱的一个自变量回归符号不符合预期,符号被扭转。需要利用因子分析或者变量聚类分析等手段来选择代表性的自变量,以减少候选变量之间的相关性;
2)预测结果呈“S”型,因此从log(odds)向概率转化的过程是非线性的,在两端随着log(odds)值的变化,概率变化很小,边际值太小,slope太小,而中间概率的变化很大,很敏感。 导致很多区间的变量变化对目标概率的影响没有区分度,无法确定阀值。
样本不均衡
class imbalance 是指分类问题中不同类别的训练样本数目差别很大的情况。
m+代表正例(类别为1的样本)数目,m-代表反例数目,预测规则变为:
如果,则预测为正例
或如果,预测为正例
假如正例少、反例多:
undersampling:先去除一些反例使两边数目接近
oversampling:先增加一些正例使两边数目接近
threshold-moving:用上面那个公式作为预测规则
sklearn的LogisticRegression()
这里是链接:
参数
看这一堆参数,我发现真正的强者可以把逻辑回归对最小化代价函数的优化问题自定义到极致。
penalty=’l2’
确定惩罚项是用L1范数还是L2范数,一般都用L2的吧。
dual=False
原问题形式还是对偶问题形式???(优化渣渣欲哭无泪)
说是如果样本数量大于特征维度,最好dual=False
tol=0.0001
终止条件,这个用改吗?为了收敛快一点把它改大些?
C=1.0
我理解这是不是正则化参数的倒数呢。必须是正的浮点数。这个值越小,正则化越强。
fit_intercept=True
应该就是说要算里面那个决策边界函数(线性的)的截距项。
intercept_scaling=1
这个没懂,算了。
class_weight=None
调整类的权重。唔,要用的时候再说吧。(感觉自己学习知识这么应付呢……
random_state=None
一个随机数种子,用于打乱数据。看起来应该不用改它。
solver=’warn’
这个'warn'是什么鬼啊…
'liblinear'是默认的,数据集比较小的话,它比较好用;
数据集大一些的话,用'sag' 'saga'会更快;
多分类问题,试试'liblinear'之外的?
'liblnear' 'saga' 处理L1惩罚项。
具体怎么选不太懂,实际问题中如果默认的很慢的话,就试试别的吧。
max_iter=100
最大迭代次数,用于 'newton-cg' 'sag' 'lbfgs'
multi_class=’warn’
怎么又冒出来warn了,佛了。
默认是'ovr',是二元问题;
'multinomial',不能用于'liblinear';
'auto',看情况自己帮你选。这个参数在是多分类问题的时候稍微注意一下吧。
verbose=0
这个,算了…
warm_start=False
如果把这个设成True,会重用之前调用过的结果作为新一轮的初始值,liblinear除外。默认设成False就是不会储存以前调用的结果。
n_jobs=None
使用的CPU核的数目…好吧我不管了。
属性
xx.classes_
类别标签
xx.coef_
里面那个线性函数的斜率项(应该是吧)。如果是二分类,就是维度为特征数目的行向量;如果多分类,是个矩阵,维度是类别数目*特征数目。
xx.intercept_
里面那个线性函数的截距项。如果是二分类,就是一个数;多分类,维度是类别数目。
xx.n_iter_
实际迭代次数
方法
decision_function (X) | Predict confidence scores for samples. |
densify () | Convert coefficient matrix to dense array format. |
fit (X, y[, sample_weight]) | Fit the model according to the given training data. |
get_params ([deep]) | Get parameters for this estimator. |
predict (X) | Predict class labels for samples in X. |
predict_log_proba (X) | Log of probability estimates. |
predict_proba (X) | Probability estimates. |
score (X, y[, sample_weight]) | Returns the mean accuracy on the given test data and labels. |
set_params (**params) | Set the parameters of this estimator. |
sparsify () | Convert coefficient matrix to sparse format. |
我居然直接把官网文档那个表格粘贴过来了……
xx.decision_function()
参数:训练数据,维度 样本数目*特征数目
返回:每个样本的置信得分
xx.densify()
如果模型之前做过稀疏处理,要用这个函数,好吧估计这个不常用
xx.fit()
参数:X 样本数目*特征数目;y 类别标签,维度样本数目;sample_weight 权重
返回一个拟合了模型的对象
xx.get_params()
输出所有参数都是怎么设的
xx.predict()
参数:要预测的数据 维度 样本数目*特征数目
返回:预测的类别标签 维度 样本数目
xx.predict_log_proba()
参数:X
返回:取对数的概率,概率是每个样本分到每一类的概率,维度 样本数目*类别数目
xx.predict_proba()
参数:X
返回:概率
xx.score()
参数:X y(y是标签真值)sample_weight
返回:得分,预测的平均准确率,浮点数
xx.set_params()
这个暂时不用了吧
xx.sparsify()
把参数矩阵(斜率项)变成稀疏形式
例子
全过了一遍,还是觉得眼花缭乱的,上个例子吧。
用iris数据集。
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
X, y = load_iris(return_X_y=True) # 总共三类
clf = LogisticRegression(solver='lbfgs',multi_class='multinomial',random_state=0,max_iter=1000).fit(X, y)
## 用的L-BFGS算法;多项式分布,理解成二项式分布的推广
## 如果用默认的迭代次数发现算法并没有收敛,虽然并不影响最终结果
print(clf.predict(X[:2, :]))
# 预测前两个样本的类别
print(clf.predict_proba(X[:2, :]))
# 前两个样本属于每一类的可能性,2*类别数
print(clf.score(X, y))
# 和真值相比,预测的准确率
#print(clf.get_params())
输出:
[0 0]
[[9.81588489e-01 1.84114969e-02 1.45146963e-08]
[9.71361183e-01 2.86387869e-02 3.02111899e-08]]
0.9733333333333334