【发布时间】:2021-11-04 17:07:37
【问题描述】:
我用逻辑回归编写了一个简单的二元分类模型。我想在继承的帮助下将它重新排列成类。我得到的输出不是我想要的:脚本没有返回请求的图和结果。结果是这样的:
main.PreProcessing 对象的绑定方法 PreProcessing.show_datafile 在 0x000001B0DCB89AC0>>
main.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
main.PreProcessing 对象的绑定方法 PreProcessing.target_distribution 位于 0x000001B0DCB89AC0>>
main.PreProcessing 对象的
有人知道怎么解决吗?谢谢
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