I guess differences in accuracies between class 0 and class 1 come from the **class_weight** parameter you have used. Class 1 will benefit from this overweighting towards class 0. You could try to play on this parameter to re-balance your results in class 0 and class 1.

An other idea could be to play on probabilities outputs and decision boundary threshold. Remember than when calling for method **.predict()**, sklearn decision tree will compare outputed probability with threshold 0.5. If it is greater than 0.5, then it assign class 1. On the contrary, if it is less than 0.5, it will assign class 0. You could try to play on this threshold by outputing probabilities first with **.predict_proba()[:,1]** and then test results for different thresholds decision boundaries. You can operate such as below :

    
    model = clf.fit(df[features], df[label])
    df["proba"] = model.predict_proba(df[features])[:,1]
    threshold = 0.4 # You can play on this value (default is 0.5)
    df["pred"] = df["proba"].apply(lambda el: 1.0 if el >= threshold else 0.0)