如何对矩阵(或数据集)进行分类

Posted

技术标签:

【中文标题】如何对矩阵(或数据集)进行分类【英文标题】:How to classify matrices (or data sets) 【发布时间】:2017-04-23 18:09:59 【问题描述】:

给定一个分类问题,训练数据如下:

input - output
--------------
A       100
B       150
C       170
..............

其中 A、B、C 是大数据集,每个都有 6 个变量和大约 5000 行。

问题是:我如何包装输入以对其他数据集输入使用分类算法,例如这些。

我尝试为每一行附加训练分类器的值并对其进行训练。对于一个新条目,每一行都会被分类,我会将平均值作为整个数据集的分类器。但是我使用朴素贝叶斯并没有很好的结果。

我应该继续使用其他分类器研究这种方法吗?我还可以考虑哪些其他选择?

编辑

来自 2 个事件的样本数据

    OUT Var1    Var2    Var3    Var4    Var5    Var6
0   93  209.2   49.4    5451.0  254.0   206.0   37.7
1       344.9   217.6   14590.5 191.7   175.5   106.8
2       663.3   97.2    17069.2 144.4   2.8     59.9
3       147.4   137.7   12367.4 194.1   237.7   116.2
4       231.8   162.2   11938.4 71.3    149.1   116.3

    OUT Var1    Var2    Var3    Var4    Var5    Var6
964 100 44.5    139.7   10702.5 151.4   36.0    17.9
966     59.8    148.9   3184.9  103.0   96.5    12.8
967     189.7   194.4   7569.6  49.9    82.6    55.2
969     158.5   88.2    2932.4  159.8   232.8   125.2
971     226.4   155.2   3156.3  85.0    4010.5  69.9

对于类似的数据集,我需要预测out值。我有很多这样的样本。

对所有行应用相同的值是否正确?

【问题讨论】:

什么?我建议阅读这样的内容:An introduction to machine learning in scikit-learn。您似乎缺少机器学习分类的一些基本原则。但是,是的,您可以尝试其他分类器。 不是分类器的问题,问题是:如何处理数据。我正在处理的变量不是字符串或数字,它们是整个数据集。 这也很有用:Classifier comparison 【参考方案1】:

查看one-hot encoding。给定一个输入变量 x,它具有三个不同的类(这通常称为“因子”),对于 x 的每个唯一值,您需要在数据集中有一个二进制编码的列,以便机器学习算法了解它正在处理(即它将能够了解为什么给定类'A' 对应于各种输出值)。

编辑!!

另一个重要说明:您要执行的操作(即将一些特征映射到连续输出变量)称为“分类”。这称为“回归”。在您的情况下,如果您翻转数据并尝试在给定 outputs(您的连续整数)的情况下预测 inputs(即 A、B 或 C),则会出现分类问题。我将在下面展示如何在您的情况下进行回归。如果您尝试按照您描述的方式进行分类,您将最终拥有len(set(df['outputs'])) 您尝试预测的不同类别的数量。分类不是在您的场景中采用的方法。

下面是一个简单粗暴的例子:

import random
from sklearn.linear_model import LogisticRegression
from sklearn.cross_validation import train_test_split
from sklearn.metrics import r2_score
import pandas as pd
import numpy as np

inputs = ['A', 'B', 'C']

# create some random data similar to yours
df = 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 classification
dummies = pd.get_dummies(df['input'])

# merge the one-hot-encoded dummies back with the original data
df = df.join(dummies)

# our feature  matrix (input values as dummies)
X = df[['A', 'B', 'C']]

# our outcome variable
y = df['output']

# split the dataset into train and test objects so we can gauge the accuracy of our classifier
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.80, random_state = 100)

# our model instance
model = LogisticRegression()

# train the classifier
model.fit(X_train, y_train)

# use trained model from above to predict the class of "new" data
predicted = model.predict(X_test)

# let's see how well the classifier performed
print(r2_score(y_test, predicted))

编辑 2

要回答您编辑的问题,只要每个样本中的行来自同一类,那么可以,您应该对样本中的每一行应用相同的值。对于上面的第一个“事件”,如果所有行(索引 0 到 4)都属于同一类/组,那么您应该将 93 应用于示例中的所有行(所有行是在课堂上)。

【讨论】:

是的,我理解分类和回归的区别。我在数据集上应用它没有问题,但在这种情况下,我对数据集本身有问题。我编辑了帖子。无论如何,谢谢你的解释。我很感激:)。 见上面的第二个编辑。我希望这能回答你的问题。

以上是关于如何对矩阵(或数据集)进行分类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Weka 中对训练和测试数据集进行分类

多层感知器对 mnist 数据集进行分类

weka中如何对整个数据集进行分类

如何在 WEKA 中测试分类数据集?

编写一个函数,使用 svm 找到混淆矩阵进行分类

当给定特定类的 0 个样本时,如何对不平衡的数据集进行分类?