给定一个分类问题,训练数据看起来如下所示:
input - output--------------A 100B 150C 170..............
其中A、B、C是大数据集,每个数据集有6个变量和大约5000行数据。
问题是:如何包装输入,以便使用分类算法处理其他类似输入的数据集。
我尝试将每行的训练分类值附加到该行上,并以此方式进行训练。对于新条目,每行都会被分类,我会将平均值(平均值)作为整个数据集的分类器。但使用朴素贝叶斯时,结果并不理想。
我应该继续探索这种方法,使用其他分类器吗?我还能考虑哪些其他选项?
编辑
来自两个事件的样本数据
OUT Var1 Var2 Var3 Var4 Var5 Var60 93 209.2 49.4 5451.0 254.0 206.0 37.71 344.9 217.6 14590.5 191.7 175.5 106.82 663.3 97.2 17069.2 144.4 2.8 59.93 147.4 137.7 12367.4 194.1 237.7 116.24 231.8 162.2 11938.4 71.3 149.1 116.3 OUT Var1 Var2 Var3 Var4 Var5 Var6964 100 44.5 139.7 10702.5 151.4 36.0 17.9966 59.8 148.9 3184.9 103.0 96.5 12.8967 189.7 194.4 7569.6 49.9 82.6 55.2969 158.5 88.2 2932.4 159.8 232.8 125.2971 226.4 155.2 3156.3 85.0 4010.5 69.9
对于类似的数据集,我需要预测出值。我有很多这样的样本数据。
将相同的值应用到所有行上是否正确?
回答:
探索独热编码。给定一个输入变量x
,它有三个不同的类别(这通常被称为“因子”),对于x
的每个唯一值,你需要在数据集中添加一个二进制编码的列,以便机器学习算法能够理解它在处理什么(即它将能够学习为什么给定的类'A'
对应于各种输出值)。
编辑!!
另一个重要说明:你想要做的事情(即将一些特征映射到一个连续的输出变量上),并不被称为“分类”。这被称为“回归”。在你的情况下,如果你翻转数据并尝试根据你的outputs
(你的连续整数)来预测inputs
(即A、B或C),这将是一个分类问题。我将在下面展示如何在你的情况下进行回归。如果你按照你描述的方式尝试分类,你最终将会有len(set(df['outputs']))
个不同的类要预测。在你的场景中,分类不是合适的方法。
以下是一个快速而粗略的示例:
import randomfrom sklearn.linear_model import LogisticRegressionfrom sklearn.cross_validation import train_test_splitfrom sklearn.metrics import r2_scoreimport pandas as pdimport numpy as npinputs = ['A', 'B', 'C']# create some random data similar to yoursdf = pd.DataFrame({'input': [random.choice(inputs) for _ in range(5000)], 'output': [int(abs(n) * 100) for n in np.random.randn(5000)]})# one-hot-encode the categorical variable 'input' for use in classificationdummies = pd.get_dummies(df['input'])# merge the one-hot-encoded dummies back with the original datadf = df.join(dummies)# our feature matrix (input values as dummies)X = df[['A', 'B', 'C']]# our outcome variabley = df['output']# split the dataset into train and test objects so we can gauge the accuracy of our classifierX_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.80, random_state = 100)# our model instancemodel = LogisticRegression()# train the classifiermodel.fit(X_train, y_train)# use trained model from above to predict the class of "new" datapredicted = model.predict(X_test)# let's see how well the classifier performedprint(r2_score(y_test, predicted))
编辑2:
为了回答你编辑后的问题,只要样本内的各行来自同一类,那么是的,你应该将相同的值应用到样本中的每一行。对于你上面的第一个“事件”,如果所有行(索引0到4)的类别/组相同,那么你应该将93
应用到样本中的所有行(所有属于该类的行)。