【问题标题】:ML model class in pythonpython中的ML模型类
【发布时间】:2021-11-04 17:07:37
【问题描述】:

我用逻辑回归编写了一个简单的二元分类模型。我想在继承的帮助下将它重新排列成类。我得到的输出不是我想要的:脚本没有返回请求的图和结果。结果是这样的:

ma​​in.PreProcessing 对象的绑定方法 PreProcessing.show_datafile 在 0x000001B0DCB89AC0>> ma​​in.PreProcessing 对象的>
计数 平均标准 最小值 25% 50% 75% 最大值 结果 768.0 0.3 0.5 0.0 0.0 0.0 1.0 1.0 糖尿病谱系函数 768.0 0.5 0.3 0.1 0.2 0.4 0.6 2.4 怀孕 768.0 3.8 3.4 0.0 1.0 3.0 6.0 17.0 皮肤厚度 768.0 20.5 16.0 0.0 0.0 23.0 32.0 99.0 体重指数 768.0 32.0 7.9 0.0 27.3 32.0 36.6 67.1 年龄 768.0 33.2 11.8 21.0 24.0 29.0 41.0 81.0 血压 768.0 69.1 19.4 0.0 62.0 72.0 80.0 122.0 胰岛素 768.0 79.8 115.2 0.0 0.0 30.5 127.2 846.0 葡萄糖 768.0 120.9 32.0 0.0 99.0 117.0 140.2 199.0 ma​​in.PreProcessing 对象的绑定方法 PreProcessing.target_distribution 位于 0x000001B0DCB89AC0>> ma​​in.PreProcessing 对象的 > ma​​in.PreProcessing 对象的绑定方法 PreProcessing.correlation 在 0x000001B0DCB89AC0>> ma​​in.PreProcessing 对象的绑定方法 PreProcessing.scaler 位于 0x000001B0DCB89AC0>> ma​​in.Logit 对象位于 0x000001B0DCB89100>

有人知道怎么解决吗?谢谢

datafile = pd.read_csv(r'diabetes_dataset.csv')  
label = datafile['Outcome']  #
cols = list(datafile.columns[:-1])   
variable_name = 'Outcome'  
main_dir = 'Final_folder'  
output_folder = os.path.join(main_dir, 'output')

scaled_dataset = pd.read_csv('scaled_dataset.csv')
new_variable_name = 'Label'




class Model:

    def __init__(self, scaled_dataset, label, new_variable_name):
        self.df = scaled_dataset
        self.label = label
        self.new_variable_name = new_variable_name

        self.model_name = self.LR_model()


    def split(self):
        y = self.label.values
        X = self.df.drop(labels=self.new_variable_name, axis=1).values
        X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=42)  
        print("N. training cases:", y_train.shape[0], "- N. test cases:", y_val.shape[0])

    @property
    def fitting(self):
        return self.model_name.fit(X_train, y_train)

    def train_predict(self):
        predicted = self.model_name.predict(X_train)
        print("Classification report for Training set classifier \n %s:\n\n%s\n"
              % (self.model_name, metrics.classification_report(y_train, predicted)))
        print("AUC train set:\n%s" % metrics.roc_auc_score(y_train,
               self.model_name.predict_proba(X_train)[:, 1]))

        class_names = [0, 1]
        fig, ax = plt.subplots()
        tick_marks = np.arange(len(class_names))
        plt.xticks(tick_marks, class_names)
        plt.yticks(tick_marks, class_names)
        sns.heatmap(pd.DataFrame(metrics.confusion_matrix(y_train, predicted)), annot=True, cmap="YlGnBu", fmt='g')
        ax.xaxis.set_label_position("top")
        plt.tight_layout()
        plt.title('Confusion matrix train set', y=1.1)
        plt.ylabel('Actual label')
        plt.xlabel('Predicted label')

    def val_predict(self):
        predicted_val = self.model_name.predict(X_val)
        print("\nClassification report for Validation set classifier \n %s:\n\n%s\n"
              % (self.model_name, metrics.classification_report(y_val, predicted_val)))
        print("AUC validation set:\n%s" % metrics.roc_auc_score(y_val, self.model_name.predict_proba(X_val)[:, 1]))

        # Confusion Matrix:
        print("\n")
        class_names = [0, 1]
        fig, ax = plt.subplots()
        tick_marks = np.arange(len(class_names))
        plt.xticks(tick_marks, class_names)
        plt.yticks(tick_marks, class_names)
        sns.heatmap(pd.DataFrame(metrics.confusion_matrix(y_val, predicted_val)), annot=True, cmap="YlGnBu", fmt='g')
        ax.xaxis.set_label_position("top")
        plt.tight_layout()
        plt.title('Confusion matrix validation set', y=1.1)
        plt.ylabel('Actual label')
        plt.xlabel('Predicted label')

    def val_roc_curve(self):
        prob_test = self.model_name.predict_proba(X_val)
        fpr, tpr, thresholds = roc_curve(y_val, prob_test[:, 1])
        plot_roc_curve(self.model_name, X_val, y_val)
        plt.show()

    def LR_model(self):
        pass


class Logit(Model):

    def __init__(self):
        super(Model, self).__init__()
        self.classifier = LogisticRegression()
        self.parameters = {'C': [1e-4, 1e-3, 1e-2, 1e-1, 1, 10],
                           'penalty': ['l1', 'l2', 'elasticnet', 'none'],
                           'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga']}

    @property
    def LR_model(self):
        CV_modelLR = GridSearchCV(estimator=self.classifier,
                                  param_grid=self.parameters,
                                  cv=3, verbose=2)
        CV_modelLR.fit(X_train, y_train)
        best_params = CV_modelLR.best_params_
        logit = LogisticRegression(penalty=best_params['penalty'],
                                   C=best_params['C'],
                                   solver=best_params['solver'],
                                   class_weight='balanced')
        return logit

    def best_train_predict(self, logit):
        predicted = logit.predict(X_train)
        print("Classification report for Training set classifier \n %s:\n\n%s\n"
              % (logit, metrics.classification_report(y_train, predicted)))
        print("AUC train set:\n%s" % metrics.roc_auc_score(y_train, logit.predict_proba(X_train)[:, 1]))

        class_names = [0, 1]
        fig, ax = plt.subplots()
        tick_marks = np.arange(len(class_names))
        plt.xticks(tick_marks, class_names)
        plt.yticks(tick_marks, class_names)
        sns.heatmap(pd.DataFrame(metrics.confusion_matrix(y_train, predicted)), annot=True, cmap="YlGnBu", fmt='g')
        ax.xaxis.set_label_position("top")
        plt.tight_layout()
        plt.title('Confusion matrix train set', y=1.1)
        plt.ylabel('Actual label')
        plt.xlabel('Predicted label')

    def best_val_predict(self, logit):
        predicted_val = logit.predict(X_val)
        print("\nClassification report for Validation set classifier \n %s:\n\n%s\n"
              % (logit, metrics.classification_report(y_val, predicted_val)))
        print("AUC validation set:\n%s" % metrics.roc_auc_score(y_val, logit.predict_proba(X_val)[:, 1]))

        # Confusion Matrix:
        print("\n")
        class_names = [0, 1]
        fig, ax = plt.subplots()
        tick_marks = np.arange(len(class_names))
        plt.xticks(tick_marks, class_names)
        plt.yticks(tick_marks, class_names)
        sns.heatmap(pd.DataFrame(metrics.confusion_matrix(y_val, predicted_val)), annot=True, cmap="YlGnBu", fmt='g')
        ax.xaxis.set_label_position("top")
        plt.tight_layout()
        plt.title('Confusion matrix validation set', y=1.1)
        plt.ylabel('Actual label')
        plt.xlabel('Predicted label')

    def best_val_roc_curve(self, logit):
        prob_test = logit.predict_proba(X_val)
        _, tpr, thresholds = roc_curve(y_val, prob_test[:, 1])
        plot_roc_curve(logit, X_val, y_val)
        plt.show()


if __name__ == '__main__':
    model = Logit()
    print(model)

【问题讨论】:

  • 如果您的问题是打印语句的显示方式而不是实际结果,您可能只需要在 Model 类中定义 __str__ 方法来覆盖内置方法。
  • 这是一个很好的资源:@​​987654321@。 TL;DR:默认情况下,__str__ 引用 __repr__,它引用对象在内存中的位置。

标签: python class inheritance


【解决方案1】:

只需将 str dunder 方法添加到您的类或父类。在 ret 中,您可以定义在输入 print(object) 后想要看到的内容。当然,不一定非得是ret,你可以在return f"Object value: {self.value}这样的return语句中做到这一点

def __str__(self):
    ret = 'String or any value from object'
    return ret

【讨论】:

    猜你喜欢
    • 2016-08-23
    • 2022-06-23
    • 2016-03-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多