python - 如何将附加模型精度保存在文本文件中?
问题描述
我正在比较一些模型并尝试输出具有所有模型精度的文件。但是,我将模型放在 for 循环中,并且尝试包含 file.write 选项,这只会提供最终模型的准确性。例如我的代码是这样的:
dataset= pd.read_csv('data.csv')
data = dataset.drop(["gene"],1)
df = data.iloc[:,0:26]
df = df.fillna(0)
X = MinMaxScaler().fit_transform(df)
le = preprocessing.LabelEncoder()
encoded_value = le.fit_transform(["certain", "likely", "possible", "unlikely"])
Y = le.fit_transform(data["category"])
sm = SMOTE(random_state=100)
X_res, y_res = sm.fit_resample(X, Y)
seed = 7
logreg = LogisticRegression(penalty='l1', solver='liblinear',multi_class='auto')
LR_par= {'penalty':['l1'], 'C': [0.5, 1, 5, 10], 'max_iter':[100, 200, 500, 1000]}
rfc =RandomForestClassifier(n_estimators=500)
param_grid = {"max_depth": [3],
"max_features": ["auto"],
"min_samples_split": [2],
"min_samples_leaf": [1],
"bootstrap": [False],
"criterion": ["entropy", "gini"]}
svm = SVC(gamma="scale")
tuned_parameters = {'kernel':('linear', 'rbf'), 'C':(1,0.25,0.5,0.75)}
inner_cv = KFold(n_splits=10, shuffle=True, random_state=seed)
outer_cv = KFold(n_splits=10, shuffle=True, random_state=seed)
models = []
models.append(('RFC', GridSearchCV(rfc, param_grid, cv=inner_cv,iid=False, n_jobs=1)))
models.append(('LR', GridSearchCV(logreg, LR_par, cv=inner_cv, iid=False, n_jobs=1)))
models.append(('SVM', GridSearchCV(svm, tuned_parameters, cv=inner_cv, iid=False, n_jobs=1)))
results = []
names = []
scoring = 'accuracy'
X_train, X_test, Y_train, Y_test = train_test_split(X_res, y_res, test_size=0.2, random_state=0)
for name, model in models:
nested_cv_results = model_selection.cross_val_score(model, X_res, y_res, cv=outer_cv, scoring=scoring)
results.append(nested_cv_results)
names.append(name)
msg = "Nested CV Accuracy %s: %f (+/- %f )" % (name, nested_cv_results.mean()*100, nested_cv_results.std()*100)
print(msg)
model.fit(X_train, Y_train)
print('Test set accuracy: {:.2f}'.format(model.score(X_test, Y_test)*100), '%')
output = msg
file = open("accuracies.txt","w")
file.write(output)
file.close()
在尝试编写输出文件时,我在 for 循环中创建的文件 'accuracies.txt' 仅给出了 SVM 的准确性,我该如何更改它以提供每个模型的准确性?
我也试过:
for name, model in models:
nested_cv_results = model_selection.cross_val_score(model, X_res, y_res, cv=2, scoring=scoring)
results.append(nested_cv_results)
names.append(name)
msg = "Nested CV Accuracy %s: %f (+/- %f )" % (name, nested_cv_results.mean()*100, nested_cv_results.std()*100)
print(msg)
model.fit(X_train, Y_train)
print('Test set accuracy: {:.2f}'.format(model.score(X_test, Y_test)*100), '%')
print("Best Parameters: \n{}\n".format(model.best_params_))
print("Best CV Score: \n{}\n".format(model.best_score_)) #average of all cv folds for a single combination of the parameters you specify
file = open("accuracies.txt","w")
file.write(results)
file.close()
但是,这给出了以下错误:
TypeError: write() argument must be str, not list
解决方案
只有 SVM 结果被写入,因为您在 for 循环的每次迭代中都覆盖了文件。尝试以下操作:
with open("accuracies.txt","w") as file: # open file before the loop
for name, model in models:
nested_cv_results = model_selection.cross_val_score(model, X_res, y_res, cv=outer_cv, scoring=scoring)
results.append(nested_cv_results)
names.append(name)
msg = "Nested CV Accuracy %s: %f (+/- %f )" % (name, nested_cv_results.mean()*100, nested_cv_results.std()*100)
print(msg)
model.fit(X_train, Y_train)
print('Test set accuracy: {:.2f}'.format(model.score(X_test, Y_test)*100), '%')
output = msg
file.write(output) # write output for each iteration
对于您的第二次尝试,您正在尝试编写一个列表对象,而不是一个字符串。为此,您可以使用f.writelines
而不是f.write
. \n
此外,如果您想要不同行上的项目,请务必添加新行。
for name, model in models:
nested_cv_results = model_selection.cross_val_score(model, X_res, y_res, cv=2, scoring=scoring)
results.append(nested_cv_results)
names.append(name)
msg = "Nested CV Accuracy %s: %f (+/- %f )\n" % (name, nested_cv_results.mean()*100, nested_cv_results.std()*100)
print(msg)
model.fit(X_train, Y_train)
print('Test set accuracy: {:.2f}'.format(model.score(X_test, Y_test)*100), '%')
print("Best Parameters: \n{}\n".format(model.best_params_))
print("Best CV Score: \n{}\n".format(model.best_score_)) #average of all cv folds for a single combination of the parameters you specify
with open("accuracies.txt","w") as file:
file.writelines(results)
推荐阅读
- http - 将 api 密钥注入谷歌脚本的 UrlFetchApp 以获取 HTTP 请求
- c++ - 将 2D 数组转换为 1D 数组,其元素为 2D 数组中的值的总和
- javascript - JS中的console.log是浏览器提供的Web Api的一部分吗
- javascript - 如何从 flatpickr 中获取选定的日期
- reactjs - React Native 钩子,useRef 和 useEffect
- java - 如何阻止多个意图按顺序打开?
- arrays - 如何在MATLAB中找出两个不同向量中的连续数字序列?
- c++ - 为什么我收到错误消息,“for”之前的预期 ID 不合格
- android - 我如何编写查询以从医生集合中获取 id 然后我将此 id 转换为当前身份验证用户 id
- python - Pandas:有条件的 2 列的累积和