【发布时间】: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