5-2,特征列feature_column

    使用特征列可以将类别特征转换为one-hot编码特征,将连续特征构建分桶特征,以及对多个特征生成交叉特征等等。

    要创建特征列,请调用 tf.feature_column 模块的函数。该模块中常用的九个函数如下图所示,所有九个函数都会返回一个 Categorical-Column 或一个 Dense-Column 对象,但却不会返回 bucketized_column,后者继承自这两个类。

    • numeric_column 数值列,最常用。
    • bucketized_column 分桶列,由数值列生成,可以由一个数值列出多个特征,one-hot编码。
    • categorical_column_with_identity 分类标识列,one-hot编码,相当于分桶列每个桶为1个整数的情况。
    • categorical_column_with_vocabulary_list 分类词汇列,one-hot编码,由list指定词典。
    • categorical_column_with_vocabulary_file 分类词汇列,由文件file指定词典。
    • categorical_column_with_hash_bucket 哈希列,整数或词典较大时采用。
    • indicator_column 指标列,由Categorical Column生成,one-hot编码
    • embedding_column 嵌入列,由Categorical Column生成,嵌入矢量分布参数需要学习。嵌入矢量维数建议取类别数量的 4 次方根。
    • crossed_column 交叉列,可以由除categorical_column_with_hash_bucket的任意分类列构成。

    二,特征列使用范例

    以下是一个使用特征列解决Titanic生存问题的完整范例。

    1. # 一,构建数据管道
    2. #================================================================================
    3. printlog("step1: prepare dataset...")
    4. dftrain_raw = pd.read_csv("./data/titanic/train.csv")
    5. dftest_raw = pd.read_csv("./data/titanic/test.csv")
    6. dfraw = pd.concat([dftrain_raw,dftest_raw])
    7. def prepare_dfdata(dfraw):
    8. dfdata = dfraw.copy()
    9. dfdata.columns = [x.lower() for x in dfdata.columns]
    10. dfdata = dfdata.rename(columns={'survived':'label'})
    11. dfdata = dfdata.drop(['passengerid','name'],axis = 1)
    12. for col,dtype in dict(dfdata.dtypes).items():
    13. # 判断是否包含缺失值
    14. if dfdata[col].hasnans:
    15. # 添加标识是否缺失列
    16. dfdata[col + '_nan'] = pd.isna(dfdata[col]).astype('int32')
    17. if dtype not in [np.object,np.str,np.unicode]:
    18. dfdata[col].fillna(dfdata[col].mean(),inplace = True)
    19. else:
    20. dfdata[col].fillna('',inplace = True)
    21. return(dfdata)
    22. dfdata = prepare_dfdata(dfraw)
    23. dftest = dfdata.iloc[len(dftrain_raw):,:]
    24. # 从 dataframe 导入数据
    25. def df_to_dataset(df, shuffle=True, batch_size=32):
    26. dfdata = df.copy()
    27. if 'label' not in dfdata.columns:
    28. ds = tf.data.Dataset.from_tensor_slices(dfdata.to_dict(orient = 'list'))
    29. else:
    30. labels = dfdata.pop('label')
    31. ds = tf.data.Dataset.from_tensor_slices((dfdata.to_dict(orient = 'list'), labels))
    32. if shuffle:
    33. ds = ds.shuffle(buffer_size=len(dfdata))
    34. ds = ds.batch(batch_size)
    35. return ds
    36. ds_train = df_to_dataset(dftrain)
    37. ds_test = df_to_dataset(dftest)
    1. #================================================================================
    2. # 三,定义模型
    3. #================================================================================
    4. printlog("step3: define model...")
    5. model = tf.keras.Sequential([
    6. layers.DenseFeatures(feature_columns), #将特征列放入到tf.keras.layers.DenseFeatures中!!!
    7. layers.Dense(64, activation='relu'),
    8. layers.Dense(1, activation='sigmoid')
    9. ])
    1. #================================================================================
    2. # 五,评估模型
    3. #================================================================================
    4. printlog("step5: eval model...")
    5. model.summary()
    6. %matplotlib inline
    7. %config InlineBackend.figure_format = 'svg'
    8. import matplotlib.pyplot as plt
    9. def plot_metric(history, metric):
    10. train_metrics = history.history[metric]
    11. val_metrics = history.history['val_'+metric]
    12. epochs = range(1, len(train_metrics) + 1)
    13. plt.plot(epochs, train_metrics, 'bo--')
    14. plt.plot(epochs, val_metrics, 'ro-')
    15. plt.title('Training and validation '+ metric)
    16. plt.xlabel("Epochs")
    17. plt.ylabel(metric)
    18. plt.legend(["train_"+metric, 'val_'+metric])
    19. plt.show()
    20. plot_metric(history,"accuracy")

    如果对本书内容理解上有需要进一步和作者交流的地方,欢迎在公众号”Python与算法之美”下留言。作者时间和精力有限,会酌情予以回复。

    也可以在公众号后台回复关键字:加群,加入读者交流群和大家讨论。