逻辑回归说的是数据的分类,估计的是一个离散值
线性回归用来估计某个连续值,如果用线性回归来归类,预测值是0.1 0.2 而不是1 和 0。
根据:
如果我们可以计算属于每个类的观察概率,我们可以将它分配给具有最高概率的类。
我们需要一个函数可以将 feature 的 Series 作为输入,返回概率值域为[0,1]
Logit函数
比值比(odds ratio) ,它可以被写成 ,其中的 代表正事件(positive event)的概率.
正事件代表我们想要预测的事件。比如:病人患有某种疾病的概率。
我们把正事件的类标签设置为1。比值比的对数称为Logit函数,它可以写成如下形式:
可以证明 的定义域为 [0,1],值域为
logit函数输入0到1的值并把它们转换为整个实数范围内的值,则
输入的是 特征向量x的条件下,类别y=1的概率, 输出的是输出范围是整个实数。
模型的线性分量包含设计矩阵和要估计的参数矢量。 自变量X的设计矩阵由N行和K + 1列组成,其中K是模型中指定的独立变量的数量。 对于设计矩阵的每一行,第一个元素xi0 = 1.这是截距或“alpha”。参数矢量β是长度为K + 1的列向量。有一个参数对应于每个 X列中的K列自变量设置加上一个β0,用于截距。
即
因此如果我们想得到特征向量x的条件下,类别y=1的概率的话,就是取 Logit() 的反函数
Sigmoid 函数
Sigmoid 图像:
定义域 ,值域[ 0 , 1]
(1)式对应的反函数如果我们只取截距 和1 列数据,得到
这就是简单Logistic回归模型
numpy.ndarray.astype( dtype )
将 array 里的数据强制转换类型
- dtype = int 转换成整形,
True
-> 1False
-> 0
numpy.reshape(a, newshape, order='C')
将矩阵换个形状
a 要换的矩阵
-
newshape: 可以是 int 类型或者是个 Tuple 类型
如果是 int 类型,返回结果是该长度的1-D 矩阵
如果是 tuple , 就根据原矩阵形成新的矩阵,( 行数,列数 )
如果 一个形状尺寸可以是-1。 在这种情况下,从阵列的长度和剩余尺寸推断出矩阵的形状。
y_true 指的是 target 的真实值数据向量
-
y_pred 指的是 target 的预测值数据向量
-
可以显示各项评估值
-
precision 精确率
精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP),也就是 [图片上传失败...(image-6339d6-1563778534298)]
recall 召回率结果是否完整
而召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN)。
[图片上传失败...(image-9a0046-1563778534298)]
f1-score F1值是精确度和召回率的调和平均值(是总体各统计变量倒数的算术平均数的倒数)
support 每个标签的出现次数
-
sklearn.metrics.classification_report(y_true, y_pred)
分类报告
可以用下面的表格再练习一下
所有的公式:
-
准确性
Accuracy: Overall, how often is the classifier correct?
- (TP+TN)/total = (100+50)/165 = 0.91
-
错误率
Misclassification Rate: Overall, how often is it wrong?
(FP+FN)/total = (10+5)/165 = 0.09
equivalent to 1 minus Accuracy
also known as "Error Rate"
-
True Positive Rate: When it's actually yes, how often does it predict yes?
TP/actual yes = 100/105 = 0.95
also known as "Sensitivity" or "Recall"
-
fall-out
False Positive Rate: When it's actually no, how often does it predict yes?
- FP/actual no = 10/60 = 0.17
-
特异性
Specificity: When it's actually no, how often does it predict no?
TN/actual no = 50/60 = 0.83
equivalent to 1 minus False Positive Rate
-
精确性
Precision: When it predicts yes, how often is it correct?
- TP/predicted yes = 100/110 = 0.91
-
Prevalence: How often does the yes condition actually occur in our sample?
- actual yes/total = 105/165 = 0.64
从混淆矩阵中我们可以得到很多关于预测结果的评价数据
True positive(TP) eqv. with hit True negative(TN) eqv. with correct rejection False positive(FP) eqv. with false alarm, Type I error False negative(FN) eqv. with miss, Type II error true positives (TP): These are cases in which we predicted yes (they have the disease), and they do have the disease.
true negatives (TN): We predicted no, and they don't have the disease.
false positives (FP): We predicted yes, but they don't actually have the disease. (Also known as a "Type I error.")
false negatives (FN): We predicted no, but they actually do have the disease. (Also known as a "Type II error.")
对于该预测结果我们得到混淆矩阵的几个基础值
混淆矩阵允许我们做出更多的分析,而不仅仅是局限在正确率。准确率对于分类器的性能分析来说,并不是一个很好地衡量指标,因为如果数据集不平衡(每一类的数据样本数量相差太大),很可能会出现误导性的结果。例如,如果在一个数据集中有95只猫,但是只有5条狗,那么某些分类器很可能偏向于将所有的样本预测成猫。整体准确率为95%,但是实际上该分类器对猫的识别率是100%,而对狗的识别率是0%。
在这165个案例中,模型预测的结果“是”110次,“否”预测55次。 实际上,样本中的105名患者患有该疾病,而60名患者没有。
假设有一个用来对是否患病预测结果进行分类的系统,混淆矩阵就是为了进一步分析性能而对该算法测试结果做出的总结。假设结果的混淆矩阵如下图:
举例说明下混淆矩阵
y_true 指的是 target 的真实值数据向量
y_pred 指的是 target 的预测值数据向量
返回值是一个混淆矩阵,分别是false positives,falsenegatives,true positives和true negatives 的值
sklearn.metrics.confusion_matrix( y_true , y_pred)
混淆矩阵
分类结果评估
-
statsmodels.api.Logit( Y, x_with_intercept)
- 这里的x_with_intercept 是训练集 中 feature 向量加上一列1的结果:
也可以用 Statsmodels.api 里的逻辑回归
指的是 回归拟合 的 特征系数
coef_
是LogisticRegression
类型的属性值之一LogisticRegression.coef_
指的是 回归拟合 的截距, 即
intercept_
是LogisticRegression
类型的属性值之一LogisticRegression.intercept_
返回给定测试集合的平均准确率(mean accuracy),浮点型数值
y_predict 是要预测的 target 的 i行数据向量,y_true 是X 对应的真实 target 数据向量
LogisticRegression.score( y_predict,y_true)
返回的结果是一个 i 行的数据,代表每一条 feature 对应的预测结果。
输入值是要预测的 feature 的 i行数据向量
根据拟合结果预测可能性
LogisticRegression.predict( X )
如果参数是默认情况下,返回的第0列是 分类为 0 的概率,第1列是分类为1 的概率
返回的结果是一个 i 行 j 列的数据,其中第i行第j列上的数值是模型预测第i个预测样本的标签为j的概率。所以每一行的和应该等于1.
输入值是要预测的 feature 的 i行数据向量
根据拟合结果预测可能性
LogisticRegression.predict_proba( X )
X 指的是训练集的 feature 数据向量
Y 训练集中的 target 值的向量
返回的是模型训练的结果
模型训练
LogisticRegression.fit(X, y)
-
C = 1e16
C 是正则化强度
Regularization strength
的倒数。正则化就是为了防止模型记忆训练集的数据,而导致预测结果的偏差。尤其是在训练集有很多变量但是数据个数少的的时候,模型训练的时候会根据训练集的数修改参数来尽可能拟合数据,然而我们想要预测的数据往往并没有训练集数据的特点(比如一个特别大的数),这样我们得到的模型的预测能力就会受损。
更具体地说,如果我们的模型遭受(高)方差(即,它过度拟合训练数据),我们可以将正则化视为增加偏差。
过多的偏差会导致欠拟合,我们在非正规化模型中的目标是最小化 cost 函数,即,我们希望找到与全局成本最小值相对应的特征权重(w)
如果我们规范成本函数(例如,通过L2正则化),我们在我们的成本函数(J)中增加一个附加值,随着参数权重(w)的值增加而增加; 添加了一个新的超参数 来控制正则化强度。
Regularization strength
越大参数在幅度上增加的可能性较小,仅仅是为了调整数据中的小扰动。
sklearn.linear_model.LogisticRegression()
逻辑回归 调用库实现
-