使用 sklearn 进行半监督学习

Posted

技术标签:

【中文标题】使用 sklearn 进行半监督学习【英文标题】:Semi supervised learning with sklearn 【发布时间】:2015-06-01 00:26:43 【问题描述】:

我有一个大型多维未标记汽车数据集(价格、里程、马力……),我想为其查找异常值。我决定使用 sklearn OneClassSVM 来构建决策边界,我的方法存在两个主要问题:

我的数据集包含很多缺失值。如果缺失特征的任何可能值是内点,有没有办法让 svm 将缺失特征的数据分类为内点? 我现在想添加手动调节异常值的反馈循环。手动调节的数据应该改进 SVM 的分类。我已经阅读了用于半监督学习的 LabelSpreading 模型。将 OneClassSVM 的分类输出提供给 LabelSpreading 模型并在手动验证足够多的记录时重新训练该模型是否可行?

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于使用 sklearn 进行半监督学习的主要内容,如果未能解决你的问题,请参考以下文章

sklearn:半监督学习 - LabelSpreadingModel 内存错误

基于协同训练的半监督文本分类算法

半监督学习官方案例

半监督学习官方案例

监督学习,无监督学习和半监督学习

监督学习 非监督学习 半监督学习