如何对矩阵(或数据集)进行分类
How to classify matrices (or data sets)
给定一个分类问题,训练数据如下所示:
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
对于类似的数据集,我需要预测输出值。我有很多这样的样品。
对所有行应用相同的值是否正确?
调查one-hot encoding。给定一个输入变量 x
,它具有三个不同的 classes(这通常称为 "factor"),对于 x
的每个唯一值,您需要一个二进制编码的数据集中的列,以便机器学习算法了解它正在处理的内容(即,它将能够了解为什么给定的 class 'A'
对应于各种输出值)。
编辑!!
另一个重要说明:您想要做的(即将某些特征映射到 连续 输出变量)是 而不是 称为 "classification." 这称为 "regression." 在您的情况下,如果您翻转数据并尝试预测 inputs
(即 A、B、或 C) 给定你的 outputs
(你的连续整数)。我将在下面展示如何在你的案例中进行回归。如果您按照您描述的方式尝试 class 化,您将最终拥有 len(set(df['outputs']))
个您试图预测的不同 classes。分类不是在您的场景中采用的方法。
下面是一个简单的例子:
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:
要回答您编辑过的问题,只要每个样本中的行来自相同的 class,那么是的,您应该对样本中的每一行应用相同的值。对于上面的第一个 "event",如果所有行(索引 0 到 4)都属于相同的 class/group,那么您应该将 93
应用于示例中的所有行( class).
中的所有行
给定一个分类问题,训练数据如下所示:
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
对于类似的数据集,我需要预测输出值。我有很多这样的样品。
对所有行应用相同的值是否正确?
调查one-hot encoding。给定一个输入变量 x
,它具有三个不同的 classes(这通常称为 "factor"),对于 x
的每个唯一值,您需要一个二进制编码的数据集中的列,以便机器学习算法了解它正在处理的内容(即,它将能够了解为什么给定的 class 'A'
对应于各种输出值)。
编辑!!
另一个重要说明:您想要做的(即将某些特征映射到 连续 输出变量)是 而不是 称为 "classification." 这称为 "regression." 在您的情况下,如果您翻转数据并尝试预测 inputs
(即 A、B、或 C) 给定你的 outputs
(你的连续整数)。我将在下面展示如何在你的案例中进行回归。如果您按照您描述的方式尝试 class 化,您将最终拥有 len(set(df['outputs']))
个您试图预测的不同 classes。分类不是在您的场景中采用的方法。
下面是一个简单的例子:
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:
要回答您编辑过的问题,只要每个样本中的行来自相同的 class,那么是的,您应该对样本中的每一行应用相同的值。对于上面的第一个 "event",如果所有行(索引 0 到 4)都属于相同的 class/group,那么您应该将 93
应用于示例中的所有行( class).