逻辑回归模型就是需要将预测结果划分为两种状态,一般为0和1。
所以我们引入一个可以将所有结果表示在0-1闭区间的函数:
y=1/(1+e^(-z))
z=θ*x
用J表示损失函数,计算交叉熵为损失函数的值。交叉熵函数可以衡量预测结果与实际结果的相似性。
离散变量的交叉熵计算:
,带入0-1的模型则如下
J=y*log(1/y_hat)+(1-y)*log(1/(1-y_hat)),化简如下:
J=-y*log(y_hat)-(1-y)*log(1-y_hat)
def cross_entropy(y, y_hat): n_samples = y.shape[0] return sum(-y*np.log(y_hat)-(1-y)*np.log(1-y_hat))/n_samples
优化模型如下:
θ=θ-α*(∂J/∂θ)
这里简单求一下偏导数就可以了,y是常数。
∂J/∂θ=(y_hat-y)*x
def optimize(theta,X,y): n = X.shape[0] alpha = 1e-1 y_hat = model(theta,X) dtheta = (1.0/n) * ((y_hat-y)*X) dtheta = np.sum(dtheta, axis=0) dtheta=dtheta.reshape((31,1)) theta = theta - alpha * dtheta return theta
之后可以对这种分类问题进行简单的评估,比如准确率,召回率,精确率。
之后不断地调用优化函数更新参数就可以了。
使用sklearn自带的数据进行测试。
from sklearn.datasets import load_breast_cancerfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegressiondataset = load_breast_cancer()x = dataset.datay = dataset.targetx_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=12345)lr = LogisticRegression()lr.fit(x_train, y_train)print(lr.score(x_train, y_train))print(lr.predict(x_test))