【问题标题】:Semi supervised learning with sklearn使用 sklearn 进行半监督学习
【发布时间】:2015-06-01 00:26:43
【问题描述】:
我有一个大型多维未标记汽车数据集(价格、里程、马力……),我想为其查找异常值。我决定使用 sklearn OneClassSVM 来构建决策边界,我的方法存在两个主要问题:
- 我的数据集包含很多缺失值。如果缺失特征的任何可能值是内点,有没有办法让 svm 将缺失特征的数据分类为内点?
- 我现在想添加手动调节异常值的反馈循环。手动调节的数据应该改进 SVM 的分类。我已经阅读了用于半监督学习的 LabelSpreading 模型。将 OneClassSVM 的分类输出提供给 LabelSpreading 模型并在手动验证足够多的记录时重新训练该模型是否可行?
【问题讨论】:
标签:
python
machine-learning
svm
outliers
【解决方案1】:
对于第一个问题。您可以使用 sklearn.preprocessing.imputer 通过均值或中位数估算缺失值:
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.Imputer.html
如果其他一些功能具有 NaN,您可以添加一些重新编码的布尔功能。所以如果你有特征 X_1, X_2 你添加布尔特征
X_1_was_NaN 和 X_2_was_NaN
如果 X_1==NaN 或 X_2==NaN,则为 1。如果 X 是您的原始 pd.DataFrame 您可以通过
创建它
X = pd.DataFrame()
# Create your features here
# Get the locations of the NaNs
X_2 = 1.0 * X.isnull()
# Rename columns
X_2.rename(columns=lambda x: str(x)+"_has_NaN", inplace=True)
# Paste them together
X = pd.concat([X, X_2], axis=1)