机器学习算法学习---处理分类问题常用算法(一)

logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同,都具有 w‘x+b,其中w和b是待求参数,其区别在于他们的因变量不同,多重线性回归直接将w‘x+b作为因变量,即y =w‘x+b,而logistic回归则通过函数L将w‘x+b对应一个隐状态p,p =L(w‘x+b),然后根据p与1-p的大小决定因变量的值。如果L是logistic函数,就是logistic回归,如果L是多项式函数就是多项式回归。
logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归。
Logistic回归模型的适用条件
1 因变量为二分类的分类变量或某事件的发生率,并且是数值型变量。但是需要注意,重复计数现象指标不适用于Logistic回归。
2 残差和因变量都要服从二项分布。二项分布对应的是分类变量,所以不是正态分布,进而不是用最小二乘法,而是最大似然法来解决方程估计和检验问题。
3 自变量和Logistic概率是线性关系
4 各观测对象间相互独立。
原理:如果直接将线性回归的模型扣到Logistic回归中,会造成方程两边取值区间不同和普遍的非直线关系。因为Logistic中因变量为二分类变量,某个概率作为方程的因变量估计值取值范围为0-1,但是,方程右边取值范围是无穷大或者无穷小。所以,才引入Logistic回归。  
Logistic回归实质:发生概率除以没有发生概率再取对数。就是这个不太繁琐的变换改变了取值区间的矛盾和因变量自变量间的曲线关系。究其原因,是发生和未发生的概率成为了比值,这个比值就是一个缓冲,将取值范围扩大,再进行对数变换,整个因变量改变。不仅如此,这种变换往往使得因变量和自变量之间呈线性关系,这是根据大量实践而总结。所以Logistic回归从根本上解决因变量要不是连续变量怎么办的问题。还有,Logistic应用广泛的原因是许多现实问题跟它的模型吻合。例如一件事情是否发生跟其他数值型自变量的关系。  
注意:如果自变量为字符型,就需要进行重新编码。一般如果自变量有三个水平就非常难对付,所以,如果自变量有更多水平就太复杂。这里只讨论自变量只有三个水平。非常麻烦,需要再设二个新变量。共有三个变量,第一个变量编码1为高水平,其他水平为0。第二个变量编码1为中间水平,0为其他水平。第三个变量,所有水平都为0。实在是麻烦,而且不容易理解。最好不要这样做,也就是,最好自变量都为连续变量。  
spss操作:进入Logistic回归主对话框,通用操作不赘述。
发现没有自变量这个说法,只有协变量,其实协变量就是自变量。旁边的块就是可以设置很多模型。
“方法”栏:这个根据词语理解不容易明白,需要说明。
共有7种方法。但是都是有规律可寻的。
“向前”和“向后”:向前是事先用一步一步的方法筛选自变量,也就是先设立门槛。称作“前”。而向后,是先把所有的自变量都进来,然后再筛选自变量。也就是先不设置门槛,等进来了再一个一个淘汰。
“LR”和“Wald”,LR指的是极大偏似然估计的似然比统计量概率值,有一点长。但是其中重要的词语就是似然。
Wald指Wald统计量概率值。
“条件”指条件参数似然比统计量概率值。
“进入”就是所有自变量都进来,不进行任何筛选
将所有的关键词组合在一起就是7种方法,分别是“进入”“向前LR”“向前Wald”"向后LR"“向后Wald”“向后条件”“向前条件”
下一步:一旦选定协变量,也就是自变量,“分类”按钮就会被激活。其中,当选择完分类协变量以后,“更改对比”选项组就会被激活。一共有7种更改对比的方法。
“指示符”和“偏差”,都是选择最后一个和第一个个案作为对比标准,也就是这二种方法能够激活“参考类别”栏。“指示符”是默认选项。“偏差”表示分类变量每个水平和总平均值进行对比,总平均值的上下界就是"最后一个"和"第一个"在“参考类别”的设置。
“简单”也能激活“参考类别”设置。表示对分类变量各个水平和第一个水平或者最后一个水平的均值进行比较。
“差值”对分类变量各个水平都和前面的水平进行作差比较。第一个水平除外,因为不能作差。
“Helmert”跟“差值”正好相反。是每一个水平和后面水平进行作差比较。最后一个水平除外。仍然是因为不能做差。
“重复”表示对分类变量各个水平进行重复对比。
“多项式”对每一个水平按分类变量顺序进行趋势分析,常用的趋势分析方法有线性,二次式。

二分类激活函数:

Sigmoid函数。

 σ(z)=1/(1+e^-z)

是一种类似阶跃函数,当x=0,Sigmoid(x)=0.5,随着x增大,值趋近1;随着x减小,值趋近0。

基于最优化方法确定最佳回归系数:

z=w0x0+w1x1+...+wnxn(z=W^TX),W即为我们要求得的最佳参数。

推导过程详细可见:https://www.jianshu.com/p/93d9fea7f4c2

1、梯度上升/下降

 要找到某函数的最大/小值,最好的方法是沿着该函数的梯度方向探寻。

w:=w+α∇f(w)

w:=w-α∇f(w)

 利用梯度下降法的逻辑回归python代码实现如下:

Coding

import matplotlib.pyplot as plt
from numpy import *
def loadDataset():
dataMat=[]
labelMat=[]
f=open('ex4x.txt')
linesx=f.readlines()
q=open('ex4y.txt')
linesy=q.readlines()
for i in range(len(linesx)):
x=linesx[i].strip().split()
y=linesy[i].strip()
dataMat.append([1.0,float(x[0]),float(x[1])])
labelMat.append(float(y))
return dataMat,labelMat
def sigmoid(inX):
return 1.0/(1+exp(-inX))
def gradDescent(dataMatIn,classLabel):
dataMatrix=mat(dataMatIn)
labelMat=mat(classLabel).transpose()
m,n=shape(dataMatrix)
alpha=0.001
maxCycles=500
weights=ones((n,1))
for k in range(maxCycles):
h=sigmoid(dataMatrix*weights)
error=(labelMat-h)
weights=weights-alpha*dataMatrix.transpose()*error
print(weights)
return weights
def plotBestFit(weights,dataMat,labelMat):
weights=array(weights)
dataArr=array(dataMat)
n=shape(dataArr)[0]
x1=[];y1=[]
x2=[];y2=[]
for i in range(n):
if int(labelMat[i])==1:
x1.append(dataArr[i,1]);y1.append(dataArr[i,2])
else:
x2.append(dataArr[i,1]);y2.append(dataArr[i,2])
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(x1,y1,s=30,c='red',marker='s')
ax.scatter(x2,y2,s=30,c='green')
x=arange(-3.0,60.0,0.1)
y=(-weights[0]-weights[1]*x)/weights[2]+80
ax.plot(x,y)
plt.xlabel('X1');plt.ylabel('X2')
plt.show()
data,label=loadDataset()
weights=gradDescent(data,label)
plotBestFit(weights,data,label)

2、随机梯度上升/下降

数据量太大,一次仅用一个样本点更新回归系数。一次处理所有的数据被称作是“批处理”。

处理数据中的缺失值:

1、使用可用特征的均值来填补缺失值;

2、使用特殊值来填补缺失值,如0/-1等;

3、忽略有缺失值的样本;

4、使用相似样本的均值填补缺失值;

5、使用另外的机器学习算法预测缺失值。

猜你喜欢

转载自www.cnblogs.com/zhenpengwang/p/10790393.html