曲哈哈哈哈哈 2024-07-13 20:03 采纳率: 0%
浏览 3

关于#机器学习#的问题:逻辑斯蒂分类(语言-python)

逻辑斯蒂分类的结果很差,有没有大lao看看什么原因?全部代码放在下面,主要问题我觉得应该可能是梯度下降不对,但是实在检查不出来

img

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();

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-13 20:03
    关注

    引自免费微信小程序:皆我百晓生

    你的代码中有几个可能的问题导致逻辑斯蒂回归分类器的性能不佳。我会逐一分析并提供可能的解决方案。

    梯度下降问题

    首先,检查你的梯度下降算法。你的更新规则看起来是正确的,但是有几个细节需要注意:

    1. 学习率调整:逻辑斯蒂回归中的梯度下降通常需要调整学习率以确保收敛。如果学习率过高,可能会导致模型不收敛或收敛到局部最优解而不是全局最优解。你可能需要尝试使用不同的学习率。
    2. 特征缩放:在进行逻辑斯蒂回归之前,确保所有的特征都在相似的尺度上。特征缩放可以加快梯度下降的收敛速度并提高模型的性能。

    模型复杂性

    检查你的模型是否过于简单或过于复杂。逻辑斯蒂回归适用于线性可分问题。如果你的数据分布非常非线性,模型可能无法准确拟合数据。你可以考虑使用更复杂的模型,如决策树、随机森林或神经网络等。

    数据问题

    检查你的数据是否适合逻辑斯蒂回归模型。确保你的数据是干净的,并且不包含噪声或异常值。另外,检查数据集的分布是否均衡,类别是否均衡也会影响模型的性能。

    代码中的其他潜在问题

    在代码中,我发现一些可能需要改进的地方:

    • 在计算损失函数时,确保正确地计算了预测概率和损失值。损失函数应该反映模型预测与真实标签之间的差异。
    • 在绘制准确率曲线和AUC曲线时,确保正确地计算了准确率和AUC值。准确率和AUC的计算方式应该正确反映模型的性能。
    • 在生成高斯分布数据时,检查数据生成的逻辑是否正确,并确保数据的分布符合你的预期。

    针对上述问题,你可以尝试以下解决方案:

    • 调整梯度下降的学习率,尝试使用不同的学习率来找到最佳值。
    • 考虑使用特征缩放来确保所有特征都在相似的尺度上。
    • 如果数据非线性可分,尝试使用更复杂的模型。
    • 检查数据的质量和分布,确保数据适合逻辑斯蒂回归模型。
    • 仔细检查代码中的逻辑和计算过程,确保计算准确且没有错误。

    此外,为了帮助你更好地理解模型的性能,你还可以考虑绘制混淆矩阵、计算召回率、精确率等指标来评估模型的性能。这些指标可以提供更多关于模型性能的信息,帮助你进行调试和改进。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月13日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见