逻辑斯蒂分类的结果很差,有没有大lao看看什么原因?全部代码放在下面,主要问题我觉得应该可能是梯度下降不对,但是实在检查不出来
def acc(y_true,y_pred):
return np.mean(y_true==y_pred);
def auc(y_true,y_pred):
return
def logistic(z):
return 1/(1+np.exp(-z));
def GD(epoch,learning_rates,l2_coef,x_train,y_train,x_test,y_test):
theta=np.random.normal(size=(x_train.shape[1],)).reshape(-1,1);
train_losses=[];
test_losses=[];
train_acc=[];
test_acc=[];
train_auc=[];
test_auc=[];
y_train.reshape(-1,1);
y_test.reshape(-1,1);
for i in range(epoch):
pred=logistic(x_train@theta).reshape(-1,1);
theta=(1-l2_coef*learning_rates)*theta+learning_rates*x_train.T@(y_train-pred);
train_loss=-y_train.T@np.log(pred)-(1-y_train).T@np.log(1-pred)+l2_coef*np.linalg.norm(theta)**2/2;
train_losses.append(train_loss/len(x_train));
test_pred=logistic(x_test@theta);
test_loss=-y_test.T@np.log(test_pred)-(1-y_test).T@np.log(1-test_pred)+l2_coef*np.linalg.norm(theta)**2/2;
test_losses.append(test_loss/len(x_test));
train_acc.append(acc(y_train,pred>=0.5));
test_acc.append(acc(y_test,test_pred>=0.5));
train_auc.append(acc(y_train,pred>=0.5));
test_auc.append(acc(y_test,test_pred>=0.5));
return theta,train_losses,test_losses,train_acc,test_acc,train_auc,test_auc;
#高斯分布参数
mean1 = np.array([0, 0])
cov1 = np.array([[1, 0], [0, 1]])
mean2 = np.array([4,4])
cov2 = np.array([[1, 0], [0, 1]])
#生成高斯分布
m=100
data1 = np.random.multivariate_normal(mean1, cov1, m)
one1=np.ones([m,1]);
data1_and_label=np.concatenate((data1,one1),axis=1);
data2 = np.random.multivariate_normal(mean2, cov2, m)
one2=0*np.ones([m,1]);
data2_and_label=np.concatenate((data2,one2),axis=1);
x1, y1 = data1[:,0],data1[:,1];
x2, y2 = data2[:,0],data1[:,1];
x=np.concatenate((data1,data2),axis=0);
y=np.concatenate((one1,one2),axis=0)
np.random.seed(0);
ratio=0.7;
split=int(len(x)*ratio);
idx=np.random.permutation(len(x));
x=x[idx];
y=y[idx];#x就是坐标,y是label
x_train,y_train=x[:split,:],y[:split];
x_test,y_test=x[split:,:],y[split:];
x_train=np.concatenate((x_train,np.ones([len(x_train),1])),axis=1);
x_test=np.concatenate((x_test,np.ones([len(x_test),1])),axis=1);
epoch=500
learning_rate=0.002;
l2_coef=1;
theta,train_losses,test_losses,train_acc,test_acc,train_auc,test_auc=GD(epoch,learning_rate,l2_coef,x_train,y_train,x_test,y_test)
train_losses=np.reshape(np.array(train_losses),[-1,1]);
test_losses=np.reshape(np.array(test_losses),[-1,1]);
train_acc=np.reshape(np.array(train_acc),[-1,1]);
test_acc=np.reshape(np.array(test_acc),[-1,1]);
train_auc=np.reshape(np.array(train_auc),[-1,1]);
test_auc=np.reshape(np.array(test_auc),[-1,1]);
#损失图像
xticks=np.arange(epoch)+1;
plt.figure(1);
plt.plot(xticks,train_losses,color='b',label='train_loss');
plt.plot(xticks,test_losses,color='r',label='train_loss');
#准确率曲线
plt.figure(2);
plt.plot(xticks,train_acc,color='b',label='train_loss');
plt.plot(xticks,test_acc,color='r',label='train_loss');
#auc曲线
plt.figure(3);
plt.plot(xticks,train_auc,color='b',label='train_loss');
plt.plot(xticks,test_auc,color='r',label='train_loss');
#分类图
plt.figure(4);
plt.scatter(x1, y1, s=15,marker='+', color='coral');
plt.scatter(x2, y2, s=15,marker='p', color='b');
plot_x=np.linspace(min(min(x1),min(x2)),max(max(x1),max(x2)),100);
plot_y=-(theta[0]*plot_x+theta[2])/theta[1];
plt.plot(plot_x,plot_y,ls='-.');
plt.show();