我知道这个问题,但它涉及到一个过时的函数。
假设我想预测一个人是否会访问国家’X’,已知他们已经访问过的国家和他们的收入情况。
我有一个训练数据集,格式如下,存储在一个pandas DataFrame中。
- 每行代表一个不同的人,这些人之间在矩阵中是彼此无关的。
- 前10列都是国家的名称,列中的值是二进制的(如果他们访问过该国家,则为1;如果没有访问过,则为0)。
- 第11列是他们的收入,是一个连续的小数变量。
- 最后,第12列是另一个二进制表,表示他们是否访问过’X’。
因此,如果我的数据集中有100,000人,那么我的DataFrame的维度是100,000 x 12
。我想能够正确地将这些数据传递到TensorFlow的线性分类器中。但我甚至不知道如何开始处理这个问题。
我尝试将数据传递到这个函数
estimator = LinearClassifier( n_classes=n_classes, feature_columns=[sparse_column_a, sparse_feature_a_x_sparse_feature_b], label_keys=label_keys)
(如果有更好的估计器建议,我愿意尝试。)
我传递数据的方式如下:
df = pd.DataFrame(np.random.randint(0,2,size=(100, 12)), columns=list('ABCDEFGHIJKL'))tf_val = tf.estimator.inputs.pandas_input_fn(X.iloc[:, 0:9], X.iloc[:, 11], shuffle=True)
然而,我不确定如何将这些输出正确地传递到分类器中。我的问题设置是否正确?我没有数据科学背景,所以任何指导都会非常有帮助!
担忧
- 第11列是一个协变量。因此,我认为它不能直接作为一个特征传递,是吗?
- 如何将第11列也纳入分类器中,因为第11列的特征类型与第1列到第10列完全不同。
- 即使我忽略第11列,至少如何拟合第1列到第10列,并将标签设置为第12列,然后传递到分类器中?
(需要工作代码来获得赏金)
回答:
线性SVM
SVM是一种最大间隔分类器,即它最大化正类与负类之间的宽度或间隔。在二分类的情况下,线性SVM的损失函数如下所示。
它可以从更通用的多类线性SVM损失(也称为铰链损失)中推导出来,如下所示(其中Δ = 1)。
注意:在上述所有方程中,权重向量w
包括偏置b
究竟是谁想出了这个损失函数的? 让我们深入探讨一下。
上图显示了属于正类的数据点与属于负类的数据点被一个分隔超平面(显示为实线)分开。然而,可以有许多这样的分隔超平面。SVM找到的分隔超平面是这样的,使得超平面到最近的正类数据点和最近的负类数据点的距离最大(显示为虚线)。
从数学上讲,SVM找到权重向量w
(包括偏置)使得
如果正类和负类的标签(y
)分别是+1
和-1
,那么SVM找到w
使得
• 如果一个数据点位于超平面的正确一侧(正确分类),那么
• 如果一个数据点位于错误一侧(错误分类),那么
因此,一个数据点的损失,即误分类的度量,可以写成