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

How can we predict target values for new data, based on a different dataset? scikit learn / gaussianNB

我很难理解训练我们的算法如何与对新数据进行预测联系起来。 我的情况:我有一个用于标记数据集的算法。在导入它、编码它、fit_transforming 它并拟合它以对 train_test_split 函数的 data_test 进行预测的步骤之后,我从使用标记的数据集得到了一个非常好的预测。 我对如何将新数据集(这次未标记)提供给已从标记数据集中学习的训练模型感到困惑。我知道从技术上讲,用于训练的数据隐瞒了自身的标签以进行预测,但我不知道如何为 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***)

一切都很好,很漂亮。但是我不明白我怎么必须给出一些东西来代替 data_test。我是否需要为新数据集提供标签列的一些占位符值?我从开始数据帧开始的标签列是最后一个。

我的尝试:

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)

注意我没有在新数据集中提供目标列。但是,如果我的列数不匹配,程序就会出错,所以我不得不至少为该列添加标签,以免它这样做:

我对它是如何工作的理解有偏差吗?请告诉我。

编辑:

我发现我在代码中搞砸了。我没有将我的目标列从数据 DataFrame 中分离出来。这就是数据为 10 列形状的原因。 终于可以体会代码的简洁了

您正在为 alg 实例化一个空模型。将拟合模型的预测返回到名为 pred 的变量。所以你实际上并没有保存拟合模型。

多个方法的串联,例如 alg.fit(data_train, target_train).predict(***data_test***) 称为方法链接,可能会造成混淆。

更简洁、更易读的替代方法是:

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`