如何将机器学习模型应用于新数据集

数据挖掘 机器学习 Python 机器学习模型
2022-03-01 14:00:59

一般来说,我对机器学习和 python 非常陌生,我正在尝试将决策树分类器应用于我正在处理的数据集。

我想用这个模型在用某些细胞特征训练它后预测结果。训练数据由结果列组成,分别将活/死细胞描述为 1 和 0。额外的列是我用于训练的蜂窝特征。

但是,我不确定如何应用我的最终模型并将其引入新数据。我想做的是让它预测“结果”选项卡(0和1值),通过给它“ASA”、“ASC”、“ASMR”、“IMIH”、“IMIA”、“TCH”的值' 在新数据集中。

我还希望它转换这些预测,并可能将它们添加到 .csv 文件中以供以后使用,但我不知道该怎么做。

这是我一直在使用的代码,我在接近结尾的部分(“加载测试数据集”)遇到问题,我认为我做错了,但我添加了完整的代码作为澄清。

import pandas
from pandas.plotting import scatter_matrix
import matplotlib.pyplot as plt
from sklearn import model_selection
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
import numpy

file = '/Users/Aida/Desktop/AlivevsDeadTest_Improved.csv'
names = ['Result', 'ASA', 'ASC', 'ASMR', 'IMIH', 'IMIA', 'TCH']
dataset = pandas.read_csv(file, names=names)

# Peek at the data
print(dataset.head(21))

# Statistical summary
print(dataset.describe())

# Split-out validation dataset
array = dataset.values
X = array[1:,1:10]
Y = array[1:,0]
validation_size = 0.20
seed = 7
X_train, X_validation, Y_train, Y_validation = model_selection.train_test_split(X, Y, test_size=validation_size, random_state=seed)

# Test options and evaluation metric
seed = 7
scoring = 'accuracy'

# Spot Check Algorithms
models = []
models.append(('LR', LogisticRegression()))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC()))

# Evaluate each model in turn
results = []
names = []
for name, model in models:
    kfold = model_selection.KFold(n_splits=10, random_state=seed)
    cv_results = model_selection.cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring)
    results.append(cv_results)
    names.append(name)
    msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())
    print(msg)

# Compare Algorithms
fig = plt.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(names)
plt.show()

# Make predictions on validation dataset
cart = DecisionTreeClassifier()
cart.fit(X_train, Y_train)
predictions = cart.predict(X_validation)
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation, predictions))
print(classification_report(Y_validation, predictions))

# Finalize model
import pickle
cart_model = DecisionTreeClassifier()
cart_model.fit(X_train, Y_train)

# Save model to disk
filename = 'Final_Model.sav'
pickle.dump(cart_model, open(filename, 'wb'))

# Load model from disk and use it to make new predictions
loaded_model = pickle.load(open(filename, 'rb'))
result = loaded_model.score(X_validation, Y_validation)
print(result)

# Load test dataset
final_predict = numpy.loadtxt("AlivevsDead_Final.csv", delimiter=";")
X_train = final_predict
pred = cart_model.predict(X_train)
print(pred)

当我运行这个脚本时,它给了我一个错误,它看起来像这样:

Traceback (most recent call last):
  File "C:/Users/Aida/Desktop/tennistesting.py", line 89, in <module>
    final_predict = numpy.loadtxt("AlivevsDead_Final.csv", delimiter=";")
ValueError: could not convert string to float: 'Result,ASA,ASC,ASMR,IMIH,IMIA,TCH'

据我了解,机器学习由 3 个步骤组成,包括训练、验证以及最后将其应用于新数据集以执行预测。我只是不知道如何引入这个新数据集并让模型对其进行预测。

当我运行模型时,我要求它显示一小部分数据集作为说明,这可以在下面找到。

 Result  ASA          ASC     ...              IMIH         IMIA          TCH
0  Result  ASA          ASC     ...              IMIH         IMIA          TCH
1       1   84  1.275275533     ...       0.650034902  0.000235479  4.126984127
2       1  218  1.020682416     ...       0.339955874  0.000535448  8.125748503
3       1  207  1.453129647     ...       0.575357024   0.00061345  5.629370629
4       1  106  1.088015726     ...       0.729552852  0.000135923  7.162162162

如果这是一个愚蠢的问题,我很抱歉!我对这一切都很陌生,并希望是否有人可以帮助我了解它是如何正确完成的。

提前致谢!

2个回答

您加载不正确,因为它是 CSV 文件(分隔符是,不是;默认情况下)是我可以得出的结论..(可能是错误的)

尝试使用熊猫库..

或者确切地说,

import pandas as pd
df_test = pd.read_csv(path to file)

你也应该使用to_featherpandas 本身来保存文件..

这样会快一些...

看起来像你的 DataFrame 的标题,

Result,ASA,ASC,ASMR,IMIH,IMIA,TCH

也是 DataFrame 的第一行,当您显示数据集的小段作为说明时,请查看第 0 个索引在哪里。

所以模型认为你的第一组数据是:

Result,ASA,ASC,ASMR,IMIH,IMIA,TCH

代替:

1   84  1.275275533     ...       0.650034902  0.000235479  4.126984127

要停止这种情况,请删除names=namesfrom

dataset = pandas.read_csv(file, names=names)

因为看起来它们已经是 csv 文件中数据的标题,pandas.read_csv 会自动提取它们。