【问题标题】:Python 3.6 - SciKitLearn - module has no attribute 'CategoricalEncoder'Python 3.6 - SciKitLearn - 模块没有属性“CategoricalEncoder”
【发布时间】:2018-06-22 06:06:22
【问题描述】:

我正在学习“使用 Scikit-Learn 和 Tensorflow 进行机器学习实践”一书。 现在,我正在尝试使用sklearn的CategoricalEncoder,但python拒绝接受它。

这是我现在的代码:

from util.fetch import *
from data.data import *
import matplotlib.pyplot as plot
from sklearn.model_selection import *
from sklearn.preprocessing import *
from sklearn.pipeline import *
import pandas.plotting as pdp


def main():

    #
    #   Basic Data Exploration
    #

    fetch_housing_data()
    housing = load_housing_data()

    housing.hist(bins=50, figsize=(20,15))
    plot.savefig(os.path.join('datasets', 'histogram.png'))

    #
    #   Creating a Test Set
    #

    train_set, test_set = train_test_split(housing, test_size=0.2, random_state=42)

    housing['income_cat'] = np.ceil(housing['median_income'] / 1.5)
    housing['income_cat'].where(housing['income_cat'] < 5, 5.0, inplace=True)

    split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
    for train_index, test_index in split.split(housing, housing['income_cat']):
        strat_train_set = housing.loc[train_index]
        strat_test_set = housing.loc[test_index]

    for set_ in (strat_train_set, strat_test_set):
        set_.drop('income_cat', axis=1, inplace=True)

    #
    #   In-depth exploration of Training Data
    #

    housing = strat_train_set.copy()

    #
    #       Plot Geographical Data
    #

    housing.plot(
        kind='scatter',
        x='longitude',
        y='latitude',
        alpha=0.4,
        s=housing['population']/100,
        label='population',
        figsize=(10,7),
        c='median_house_value',
        cmap=plot.get_cmap('jet'),
        colorbar=True)

    #plot.show()
    plot.savefig(os.path.join('datasets','geodata.png'))

    corr_matrix = housing.corr()

    print(corr_matrix['median_house_value'].sort_values(ascending=False))

    attributes = ['median_house_value','median_income','total_rooms','housing_median_age']
    pdp.scatter_matrix(housing[attributes], figsize=(12,8))
    plot.savefig(os.path.join('datasets', 'scatter_matrix.png'))

    housing.plot(
        kind='scatter',
        x='median_income',
        y='median_house_value',
        alpha=0.1)
    plot.savefig(os.path.join('datasets', 'median_income-median_house_value.png'))

    housing['rooms_per_household'] = housing['total_rooms'] / housing['households']
    housing['bedrooms_per_room'] = housing['total_bedrooms'] / housing['total_rooms']
    housing['population_per_household'] = housing['population'] / housing['households']

    corr_matrix = housing.corr()

    corr_file = open(os.path.join('datasets','median_house_value_corr.txt'), 'w+')
    corr_file.write(str(corr_matrix['median_house_value'].sort_values(ascending=False)))
    corr_file.close()

    #
    #   Preparing data for Machine Learning Algorithms
    #
    housing = strat_train_set.drop('median_house_value', axis=1)
    housing_labels = strat_train_set['median_house_value'].copy()

    num_attribs = list(housing_num)
    cat_attribs = ['ocean_proximity']

    num_pipeline: Pipeline = Pipeline([
        ('selector', DataFrameSelector(num_attribs)),
        ('imputer', Imputer(strategy='median')),
        ('attribs_adder', CombinedAttributesAdder()),
        ('std_scaler', StandardScaler()),
    ])

    cat_pipeline: Pipeline = Pipeline([
        ('selector', DataFrameSelector(cat_attribs)),
        ('cat_encoder', CategoricalEncoder(encoding='onehot-dense'))
    ])

    full_pipeline = FeatureUnion(transformer_list=[
        ('num_pipeline', num_pipeline),
        ('cat_pipeline', cat_pipeline),
    ])


if __name__ == '__main__':
    main()

这给我带来了问题,但当它到达第 123 行时,我收到以下错误:

Traceback (most recent call last):
  File "***/Housing/main.py", line 133, in <module>
    main()
  File "***/Housing/main.py", line 123, in main
    ('cat_encoder', CategoricalEncoder(encoding='onehot-dense'))
NameError: name 'CategoricalEncoder' is not defined

(我已经审查了堆栈跟踪中的路径)

我已经尝试了各种方法来让它正确导入,但不幸的是我失败了。使用任何其他 sklearn 类都没有任何问题,只是 CategoricalEncoder。书上提到 CategoricalEncoder 类比较新,可能还没有出来,是这样吗?

我已经检查了 sklearn 文档,它们提供了指向实现此功能的源代码的链接,但是当我查看虚拟环境中的相应文件时,我至少缺少 400-500 行代码。我正在使用 PyCharm 并让它根据需要安装所有依赖项。

(我知道最后的管道现在没有运行,因为脚本在这些之前停止执行,这不是一个真正的问题......)

【问题讨论】:

  • from something import * 根本不是一个好习惯,它会让你的命名空间充满各种各样的东西。在这种情况下,如果您在导入中明确表示,则跟踪错误会容易得多;他们可能重构了库,现在以不同的方式访问它。以您目前的导入方法,我不知道它应该来自哪个模块。
  • 谢谢你,要明确一点,我应该做from scikit import Pipeline之类的,对吧?
  • 类似的东西,是的。或者只是导入模块并用作scikit.Pipeline(使用scikit 之类的模块可能不太实用)或import scikit as sc,然后您可以使用sc.Pipeline。任何能让你知道它来自哪个模块的东西。

标签: python scikit-learn python-import


【解决方案1】:

CategoricalEncoder 仅在开发版本 0.20.dev0 中可用。此版本不会由 pip、conda 或任何其他包管理器自动安装,如果您想使用该版本,则需要专门安装它。

在这种情况下,您必须按照Sklean - Advanced Installation - Install Bleeding Edge 中的说明获取开发版本。

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 2019-07-17
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2018-06-13
    • 2017-11-21
    相关资源
    最近更新 更多