处理极不平衡且关联性差的数据集

时间:2018-11-17 18:14:04

标签: python scikit-learn classification

我正在处理一个困难的数据集,因为这些类既高度不平衡又极其不相关。该集合有96,000个值,其中不到200个是1s。

我尝试了几种方法,每种方法的精度和准确性始终很高,但是只有少数(小于5个)值被分类为1。我想知道是否有一种方法可以强制机器进行分类更多1s。如果我只能在25%的时间内正确分类,那将是一个很好的结果。

我尝试使用随机森林的“类权重”参数,但这似乎对结果没有任何影响。

SingingError

输出:

import numpy as np
import pandas as pd
import sklearn as sklearn
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_pickle('/Users/shellyganga/Downloads/ola.pickle')

print(df.describe())

#filtering the df to improve results
df = df[(df['trip_duration'] > 5) & (df['Smooth_Driving_Score'] < 99)]

print(df.describe())


maxVal = 1
df.unsafe = df['unsafe'].where(df['unsafe'] <= maxVal, maxVal)

df.drop(df.columns[0], axis=1, inplace=True)
df.drop(df.columns[-2], axis=1, inplace=True)

#setting features and labels
labels = np.array(df['unsafe'])
features= df.drop('unsafe', axis = 1)

# Saving feature names for later use
feature_list = list(features.columns)

# Convert to numpy array
features = np.array(features)

from sklearn.model_selection import train_test_split

# 30% examples in test data
train, test, train_labels, test_labels = train_test_split(features, labels,
                                                          stratify = labels,
                                                          test_size = 0.4,
                                                          random_state = 12)

from sklearn.ensemble import RandomForestClassifier

# Create the model with 100 trees
model = RandomForestClassifier(n_estimators=100,
                               random_state=12,
                               max_features = 'sqrt',
                               n_jobs=-1, verbose = 1, class_weight={0:1, 1:1})

# Fit on training data
model.fit(train, train_labels)
predictions = model.predict(test)


print(np.mean(predictions))
print(predictions.shape)


from sklearn.metrics import classification_report
print(classification_report(test_labels, predictions)

我尝试使用 precision recall f1-score support 0 1.00 1.00 1.00 38300 1 1.00 0.01 0.02 90 avg / total 1.00 1.00 1.00 38390 并提供了不同的结果,但是我很难理解它。

{class_weight = 'balanced'}

我怎么知道它预测了多少阳性?

1 个答案:

答案 0 :(得分:0)

这种不平衡程度通常很难解决,特别是如果您具有很多功能(由于维数的诅咒)。除非两个阶级之间有非常明显的界限,否则将很难从压倒多数的阶级中识别出少数阶级。正如Luke和Tacratis所建议的那样,类权重和过采样/欠采样都是您应该尝试的好方法。另外,我还建议使用适当的成本指标。例如,如果假阳性比假阴性更可取,请尝试使查全率最大化,而不是准确性或准确性。我还建议结合使用这些方法。所以,假设

  1. 将少数类超采样到1000行。过采样时尝试SMOTE。
  2. 欠采样少数类到5000-10000行。
  3. 应用类权重创建平衡集。
  4. 在测试集上评估成本指标,并更改上述数字,直到指标最大化。

所有这些,对于一个训练有素的模型,您可能没有足够的少数派样本。如果您能够在训练集上实现较高的成本度量标准,但却无法在测试集上推广度量标准,那么情况就是如此。