Python 2.7 scikit学习中单类支持向量机的二值分类

Python 2.7 scikit学习中单类支持向量机的二值分类,python-2.7,scikit-learn,classification,svm,supervised-learning,Python 2.7,Scikit Learn,Classification,Svm,Supervised Learning,我正在研究不平衡数据集的二元分类。该数据集包含777个少数类和2223个多数类。我建立了一个只包含少数标记记录的单类SVM模型。但是,当我尝试在构建的模型上进行预测时,我得到的预测值为all-1,因此精度为0。我已缩放了我的特征。 这是我的实现 ml_file_df = pd.read_csv('/data/jayashree/3000_ML_features.csv') minority_df = ml_file_df[ml_file_df['RESULT'] == 0] array = mi

我正在研究不平衡数据集的二元分类。该数据集包含777个少数类和2223个多数类。我建立了一个只包含少数标记记录的单类SVM模型。但是,当我尝试在构建的模型上进行预测时,我得到的预测值为all-1,因此精度为0。我已缩放了我的特征。 这是我的实现

ml_file_df = pd.read_csv('/data/jayashree/3000_ML_features.csv')
minority_df = ml_file_df[ml_file_df['RESULT'] == 0]
array = minority_df.values
features = array[:, 0:60630]
labels = array[:, 60630]
scaler = MinMaxScaler()
scaled_features = scaler.fit_transform(features)
features_train, features_test, labels_train, labels_test = train_test_split(
    scaled_features, labels, test_size=0.3, random_state=10)
gamma_values = [0.001, 0.005, 0.01, 0.05, 0.1, 0.5]
nu_values = [0.1, 0.3, 0.5, 0.7]
for j in nu_values:
    for i in gamma_values:
        clf = svm.OneClassSVM(nu=j, kernel='rbf', gamma=i)
        clf.fit(features_train, labels_train)
        pred = clf.predict(features_test)
        print(i, classification_report(labels_test, pred))
在所有情况下,我都得到了这样的预测

[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1 -1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1 -1 -1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1  1 -1 -1 -1 -1 -1 -1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1  1 -1 -1 -1 -1  1]
我哪里做错了


我已经解决了错误。一类svm将预测1或-1。我使用少数类作为1,多数类作为-1。这解决了我的问题。

这是因为您有
0
1
标签,一类svm显示
-1
1
,你交换
-1
0
就足够了,因为你有
0
1
标签和一类SVM显示
-1
1
,你交换
-1
0
就足够了,这对我们来说是不可复制的,因为你不共享你的数据(并且代码至少缺少导入)。但显而易见的第一步是:使用线性内核使事情变得更简单。在此之后,您可能会了解您的参数或数据是否有问题。我觉得分割数据集时有错误。为什么不使用sklearn的test_train_split?您的标签变量似乎不是一维的。这对于r我们,因为您不共享数据(代码至少缺少导入)。但显而易见的第一步是:使用线性内核使事情变得更简单。在此之后,您可能会了解您的参数或数据是否存在问题。我觉得分割数据集时有错误。为什么不使用sklearn的test_train_split?您的标签变量似乎不是一维的。