首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何“记住”训练后实际预测的绝对编码?

如何“记住”训练后实际预测的绝对编码?
EN

Stack Overflow用户
提问于 2018-07-26 13:54:36
回答 2查看 182关注 0票数 0

假设需要在包含某些分类参数的数据集上训练机器学习算法。(刚开始机器学习,但我的想法是.)即使将所有的分类数据转换为1热编码的向量,训练后如何“记住”这个编码地图?

例如:在训练前将初始数据集转换为使用1-热编码,例如

代码语言:javascript
运行
AI代码解释
复制
universe of categories for some column c is {"good","bad","ok"}, so convert rows to
[1, 2, "good"] ---> [1, 2, [1, 0, 0]],
[3, 4, "bad"]  ---> [3, 4, [0, 1, 0]],
... 

,在对模型进行培训之后,所有未来的预测输入都需要对c列使用相同的编码方案。

那么,在未来预测期间,数据输入将如何记住映射(其中“很好”映射到索引0,等等)(具体来说,当计划使用keras RNN或LSTM模型时)?我需要把它保存在某个地方吗?(如果是,我如何获得显式映射)?或者有一种方法可以让模型在内部自动处理分类输入,这样就可以在培训和将来使用期间输入原始标签数据了吗?

如果这个问题中有任何东西表明我对某件事有任何严重的混淆,请告诉我(同样,对于ML非常陌生)。

**不确定这是否属于https://stats.stackexchange.com/,但在这里张贴,因为它特别想知道如何处理这个问题的实际代码实现。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-27 00:09:44

我的想法是在培训/测试dataset D上执行类似的操作(使用python和普通psudo代码的混合):

  1. 做一些类似的事情
代码语言:javascript
运行
AI代码解释
复制
    # Before: D.schema == {num_col_1: int, cat_col_1: str, cat_col_2: str, ...}

    # assign unique index for each distinct label for categorical column annd store in a new column
    # http://spark.apache.org/docs/latest/ml-features.html#stringindexer
    label_indexer = StringIndexer(inputCol="cat_col_i", outputCol="cat_col_i_index").fit(D)
    D = label_indexer.transform(D)

    # After: D.schema == {num_col_1: int, cat_col_1: str, cat_col_2: str, ..., cat_col_1_index: int, cat_col_2_index: int, ...}

对于所有的分类列

  1. 然后,对D中所有这些分类名称和索引列,绘制一张表格地图
代码语言:javascript
运行
AI代码解释
复制
    map = {}
    for all categorical column names colname in D:
        map[colname] = []
        # create mapping dict for all categorical values for all 
        # see https://spark.apache.org/docs/latest/sql-programming-guide.html#untyped-dataset-operations-aka-dataframe-operations
        for all rows r in D.select(colname, '%s_index' % colname).drop_duplicates():
            enc_from = r['%s' % colname]
            enc_to = r['%s_index' % colname]
            map[colname].append((enc_from, enc_to))

        # for cats that may appear later that have yet to be seen 
        # (IDK if this is best practice, may be another way, see https://medium.com/@vaibhavshukla182/how-to-solve-mismatch-in-train-and-test-set-after-categorical-encoding-8320ed03552f)
        map[colname].append(('NOVEL_CAT', map[colname].len))
        # sort by index encoding
        map[colname].sort(key = lamdba pair: pair[1])    

以这样的方式结束

代码语言:javascript
运行
AI代码解释
复制
    {
        'cat_col_1': [('orig_label_11', 0), ('orig_label_12', 1), ...],
        'cat_col_2': [(), (), ...],
        ...
        'cat_col_n': [(orig_label_n1, 0), ...]
    }

然后,它可以用于为以后任何数据样本行ds中的每个分类列生成1热编码向量。例如:

代码语言:javascript
运行
AI代码解释
复制
    for all categorical column names colname in ds:
        enc_from = ds[colname]
        # make zero vector for 1-hot for category 
        col_onehot = zeros.(size = map[colname].len)
        for label, index in map[colname]:
            if (label == enc_from):
                col_onehot[index] = 1
                # make new column in sample for 1-hot vector
                ds['%s_onehot' % colname] = col_onehot
                break
  1. 然后,可以将此结构保存为泡菜pickle.dump( map, open( "cats_map.pkl", "wb" ) ),以便在以后进行实际预测时与分类列值进行比较。

**可能有更好的方法,但我认为需要更好地理解这篇文章(https://medium.com/@satnalikamayank12/on-learning-embeddings-for-categorical-data-using-keras-165ff2773fc9)。如果有什么新的答案。

票数 0
EN

Stack Overflow用户

发布于 2021-03-03 05:18:39

我一直在做的是:

在使用StringIndexer.fit()之后,可以保存它的元数据(包括实际的编码器映射,比如"good“是第一列)

下面是我使用的代码(使用java,但可以调整为python):

代码语言:javascript
运行
AI代码解释
复制
StringIndexerModel sim = new StringIndexer()
        .setInputCol(field)
        .setOutputCol(field + "_INDEX")
        .setHandleInvalid("skip")
        .fit(dataset);

sim.write().overwrite().save("IndexMappingModels/" + field + "_INDEX");

稍后,在尝试对新数据集进行预测时,可以加载存储的元数据:

代码语言:javascript
运行
AI代码解释
复制
StringIndexerModel sim = StringIndexerModel.load("IndexMappingModels/" + field + "_INDEX");

dataset = sim.transform(dataset);

我想你已经解决了这个问题,自从2018年发布以来,但是我没有在其他地方找到这个解决方案,所以我相信它值得分享。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51548041

复制
相关文章
Excel按列排序和按行排序
文章背景:Excel二维表中记录着多行多列的数据,有时需要按行或按列排序,使数据更加清晰、易读。下面分别对按列排序和按行排序进行介绍。
Exploring
2022/08/10
3.2K0
Excel按列排序和按行排序
Linux 查看目录下所有的日期信息(按最新日期排序)
1、查看当前目录文件 2、查看目录下文件日期的详细信息 ls --full-time 3、编写 shell 脚本 :monitor.sh #!/bin/bash echo "-------------
静谧星空TEL
2021/04/27
3.5K0
Linux 查看目录下所有的日期信息(按最新日期排序)
pandas排序 按索引和值排序
pandas 排序 import pandas as pd import numpy as np unsorted_df=pd.DataFrame(np.random.randn(10,2),index=[1,4,6,2,3,5,9,8,0,7],columns=['col2','col1']) print (unsorted_df) # 按标签排序 sorted_df = unsorted_df.sort_index(ascending=False) # 降序 print (sorted_df) s
AI拉呱
2021/01/14
2.8K0
hastable按值排序
最近做了一个项目,需要对一个2维数组的值进行排序然后再取出对应的Key值。开始是用HashTable做的,不过HashTable中的排序只是对Key进行排序,如果想对值进行排序得用其它办法。下面我就把这种方法说下:
codeniu
2022/02/25
1.4K0
python 按中文排序
安装中文库 sudo apt-get update sudo apt-get install language-pack-zh-hans-base sudo dpkg-reconfigure locales 使用 import locale locale.setlocale(locale.LC_COLLATE, 'zh_CN.UTF8') cmp = locale.strcoll courses.sort(lambda x, y: cmp(x.course_name, y.course_name)) 测试
py3study
2020/01/06
1.7K0
【MySQL基础】mysql如何实现中文按拼音排序查询
在查询的时候,经常用到排序,英文的排序自然好说,但是在线上特定场景环境中,可能需要对中文进行排序,比如用户的姓名、地址等等。在mysql中如何对中文排序呢?我们可以使用ORDER BY CONVERT(列名 USING 字符编码集)函数即可将中文列名按拼音顺序进行排序。
青山师
2023/05/04
3.1K1
map按key和按value排序
看一个题: 查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 例示: jack 70 peter 96 Tom 70 smith 67 从高到低 成绩 peter 96 jack 70 Tom 70 smith 67 从低到高 smith 67 Tom 70 jack 70 peter 96 1、按照value排序 2、可以递增排序和递减排序 3、保证排序的稳定性 golang map按key排序 //golang的map不保证有序
李海彬
2018/03/27
3.3K0
map按key和按value排序
看一个题: 查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 例示: jack 70 peter 96 Tom 70 smith 67 从高到低 成绩 peter 96 jack 70 Tom 70 smith 67 从低到高 smith 67 Tom 70 jack 70 peter 96 1、按照value排序 2、可以递增排序和递减排序 3、保证排序的稳定性 golang map按key排序 //golang的map不保证有序
李海彬
2018/03/27
4.7K0
数组按指定顺序排序
数组排序可以直接使用 sort() 方法,可以对数组按规律排序。 但如果指定一个没有规律的顺序进行排序呢? 同样可以使用  sort() 方法: const data = [   { name: '张三', code: 'zs' },   { name: '王五', code: 'ww' },   { name: '赵七', code: 'zq' }, ]; data.sort((star, next) => {   const sortList = ['zq', 'zs', 'ww']   return 
德顺
2022/06/12
2.8K0
Map按单个或多个Value排序,当Value相同时按Key排序
Map可以先按照value进行排序,然后按照key进行排序。 或者先按照key进行排序,然后按照value进行排序,这都是可以的。
向着百万年薪努力的小赵
2023/01/10
2.6K0
php将二维数组按日期(支持Ymd和Ynj格式日期)排序 转
// 原始数组 $array = [         [             'date'=>'2019-2-18',         ],         [             'date'=>'2019-2-4',         ],         [             'date'=>'2019-2-19',         ],         [             'date'=>'2019-2-21',         ],         [             'date'=>'2019-2-24',         ],     ]; var_dump(order_date_array($array, 'desc', 'date')); /*  * 将二维数组按日期(支持Ymd和Ynj格式日期)排序  * order_date_array(原始二维数组, desc还是asc, 日期在二维数组中的键)  * */ function order_date_array($array, $order, $key){     if (!$array){         return [];     }else{         $_array = $array;     }     if (!$order){         $_order = 'desc';     }else{         $_order = $order;     }     if (!$key){ // 二维数据中的Ynj日期的键         $_key = 'date';     }else{         $_key = $key;     }     $new_array = [];     $array_1 = [];     $array_2 = [];     // 日期转时间戳     for ($t=0; $t<count($_array); $t++){         $date = strtotime($_array[$t][$_key]); // Ymd或者Ynj格式日期转时间戳         $array_1[] = $date;         $array_2[] = $date;     }     // 排列方式     if ($_order === 'desc'){ // 降序         rsort($array_2);     }else{ // 升序         sort($array_2);     }     // 重新排序原始数组     for ($r=0; $r<count($array_2); $r++){         $index = array_search($array_2[$r], $array_1); // 元素索引         $new_array[] = $_array[$index];     }     return $new_array; }
双面人
2019/05/21
3K0
MYSQL用法(十六) MySQL按指定字段自定义列表排序
要求:按照字段IS_NEW_PROJ的降序、字段LOAN_APR的降序、字段GMT_BUY_START的升序排序
Java架构师必看
2021/05/31
2.5K0
MYSQL用法(十六) MySQL按指定字段自定义列表排序
MySQL按坐标排序和查找指定范围的坐标
做的项目多了,总会遇到一些需要涉及需要用到地图坐标的。 既然有坐标,那肯定又得涉及位置距离。 例如我们平时使用美团,想搜索附近的美食店,这功能很方便是不是? 希望下面的经验能给你帮助,让你少走些弯路,同时自己做个笔记,方便自己。 毕竟老了,有些东西很快就自己也忘记了,也需要笔记来回忆~
jwj
2022/05/18
2.1K0
LeetCode - 按奇偶排序数组
LeetCode第905题,难度简单。这题很容易联想到之前发过的LeetCode - 按奇偶排序数组②
晓痴
2019/08/01
1.3K0
LeetCode - 按奇偶排序数组
1177: 按要求排序(指针专题)
输入n和n个整数,然后按要求排序,若输入1,请输出升序排序序列;若输入2,请输出降序排序序列,若输入3,请输出按绝对值升序排序序列。要求程序结构如下,请完善程序。
怠惰的未禾
2023/04/27
6030
按奇偶排序数组II
力扣题目链接:https://leetcode-cn.com/problems/sort-array-by-parity-ii/
代码随想录
2021/10/19
1.1K0
BI技巧丨按列排序
PowerBI本身内置的排序方式,是遵循ASCII国际标准的方式,这就导致了中文的默认排序对于很多小伙伴来说并不友好。
PowerBI丨白茶
2022/11/12
3.5K0
BI技巧丨按列排序
LeetCode - 按奇偶排序数组②
这题是LeetCode第N次周赛的题目,题号是922,难度是Easy,当时处于疯狂刷通过率高的题目,然后提高自己的信心的地步...看提交记录,应该是一个月三周前提交的了。
晓痴
2019/07/24
1.3K0
LeetCode - 按奇偶排序数组②
按奇偶排序数组II
给定一个非负整数数组A,A中一半整数是奇数,一半整数是偶数。 对数组进行排序,以便当A[i]为奇数时,i也是奇数;当A[i]为偶数时,i也是偶数。 你可以返回任何满足上述条件的数组作为答案。
WindRunnerMax
2020/11/13
1.2K0
展示斗地主扑克牌,支持按出牌规则排序!支持按大小排序!
一副牌有54张,我们给每张牌1个编号(id),取值1-54。如果涉及到2副牌,就取id为1-108。
HullQin
2023/06/28
2.1K0

相似问题

如何在主键列中重用Oracle序列间隙?

22

SQL查询:查找主键中的间隙

20

自动递增ids /主键中的“间隙”会导致任何问题吗?

12

使用序列自动设置Oracle主键

23

从自动增量主键中获取已删除主键列表

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文