Python 我们如何根据不同的数据集预测新数据的目标值?scikit学习/高斯学习

Python 我们如何根据不同的数据集预测新数据的目标值?scikit学习/高斯学习,python,machine-learning,scikit-learn,naivebayes,Python,Machine Learning,Scikit Learn,Naivebayes,我正在努力理解我们的算法训练是如何与对新数据进行预测联系在一起的。 我的情况:我有一个算法,我在一个标记的数据集上使用。经过导入、编码、拟合、变换和拟合的步骤,对train\u test\u split函数的数据进行预测,我使用标记的数据集得到了一个非常好的预测。 我被难倒了,我需要如何将一个新的数据集(这次没有标记)提供给经过训练的模型,该模型已从标记的数据集学习。我知道,从技术上讲,用于训练的数据不允许标签本身进行预测,但我不知道如何提供gaussianNB算法新的数据特征来预测未知标签 我

我正在努力理解我们的算法训练是如何与对新数据进行预测联系在一起的。 我的情况:我有一个算法,我在一个标记的数据集上使用。经过导入、编码、拟合、变换和拟合的步骤,对train\u test\u split函数的数据进行预测,我使用标记的数据集得到了一个非常好的预测。 我被难倒了,我需要如何将一个新的数据集(这次没有标记)提供给经过训练的模型,该模型已从标记的数据集学习。我知道,从技术上讲,用于训练的数据不允许标签本身进行预测,但我不知道如何提供gaussianNB算法新的数据特征来预测未知标签

我的培训代码:

df = pd.read_csv(chosen_file, sep=',')
cat_cols = df.select_dtypes(include=['object'])
cat_cols_filled = cat_cols.fillna('0')
le = LabelEncoder()
cat_cols_fitted = cat_cols_filled.apply(lambda col: le.fit_transform(col))
non_cat_cols = df.select_dtypes(exclude=['object'])
non_cat_cols_filled = non_cat_cols.fillna('0')
non_cat_cols_fitted = non_cat_cols_filled.apply(lambda col: le.fit_transform(col))
target_prep = df.iloc[:,-1]
target = le.fit_transform(target_prep.astype(str))
data = pd.concat([cat_cols_fitted, non_cat_cols_fitted], axis=1)
try:
    data_train, data_test, target_train, target_test = train_test_split(data, target, train_size=0.3))
alg = GaussianNB()
pred = alg.fit(data_train, target_train).predict(***data_test***)
这一切都很好。但我无法理解我如何给出一些东西来代替数据测试。我是否需要为新数据集提供标签列的一些占位符值?从开始的dataframe开始的标签列是最后一列

我的尝试:

new_df = pd.read_csv(new_chosen_file, sep=',')
new_cat_cols = new_df.select_dtypes(include=['object'])
new_cat_cols_filled = new_cat_cols.fillna('0')
new_cat_cols_fitted = new_cat_cols_filled.apply(lambda col: le.fit_transform(col))
new_non_cat_cols = new_df.select_dtypes(exclude=['object'])
new_non_cat_cols_filled = new_non_cat_cols.fillna('0')
new_non_cat_cols_fitted = new_non_cat_cols_filled.apply(lambda col: le.fit_transform(col))
new_data = pd.concat([new_cat_cols_fitted, new_non_cat_cols_fitted], axis=1)
print(new_data)
new_pred = alg.predict(new_data)
new_prediction = pd.DataFrame({'NEW ML prediction':new_pred})
print(new_pred)
print(new_prediction)
请注意,我没有在新数据集中提供目标列。但是,如果我的列计数不匹配,程序就会出错,因此我必须至少为列添加标签,以使其不匹配:

我对这项工作的理解有偏差吗?请让我知道

编辑:

我发现我的主要错误在代码中。我没有将我的目标列从数据帧中隔离出来。这就是为什么数据是10列的形状。
我终于明白了代码的简单性。

您正在将一个空模型实例化为
alg
。将拟合模型的预测返回到名为
pred
的变量。因此,您实际上并没有保存已安装的模型

多个方法的串联,例如
alg.fit(数据序列、目标序列)。predict(***数据测试***)
被称为方法链接,可能导致混淆

一个更清晰、可读性更强的替代方案是:

alg = GaussianNB()                       # initiating model
alg = alg.fit(data_train, target_train)  # fitting model with train data
pred = alg.predict(***data_test***)      # testing with test data
new_pred = alg.predict(new_data)         # test with new data`     

请注意,我没有在新数据集中提供目标列。训练模型时,不应在数据训练中包括目标列set@akhetos我该怎么做?当约定为:data\u train,data\u test,target\u train,target\u test=train\u test\u split(data,target,train\u size=0.3))如果我不提供目标-无法进行预测?但是pred是一个numpy.ndarray对象,因此它没有“predict”属性。因此,为了预测新的未标记数据-我所缺少的就是使用算法对象,安装了训练数据而不是算法本身,对吗?另外,是否希望2(您的示例)更好地理解为:alg_fit=alg.fit(data_train,target_train)?因为现在我们似乎重新声明了gaussianNB()对象是的。您没有将经过训练的模型保存到变量。您正在将预测结果(一个numpy数组)保存到“pred”。因此,当您调用alg.predict(new_data)时,实际上是在调用一个空的alg对象。是的,您可以这样做。你甚至可以疯狂&将模型放在一行中。ie:alg=GaussianNB().fit(数据序列、目标序列)。这仍然会将经过训练的模型返回给alg。但是,predict函数不会返回经过训练的模型,而是将结果预测作为numpy数组返回。希望现在一切都清楚了。:)还有一件事-为什么我的新数据集需要包含目标列名?如果没有它,我在问题中提供的图片中会出现错误。