特征更多的时候是分类特征,而不是连续的数值特征。 比如一个人的特征可以是``[“male”, “female”]``, ["from Europe", "from US", "from Asia"], ["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]。 这样的特征可以高效的编码成整数,例如 ["male", "from US", "uses Internet Explorer"]``可以表示成 ``[0, 1, 3],["female", "from Asia", "uses Chrome"]``就是``[1, 2, 1]。
from sklearn import preprocessing
>>> enc = preprocessing.OneHotEncoder() >>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) OneHotEncoder(categorical_features='all', dtype=<... 'float'>, handle_unknown='error', n_values='auto', sparse=True) >>> enc.transform([[0, 1, 3]]).toarray() array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])
这个的整数特征表示并不能在scikit-learn的估计器中直接使用,因为这样的连续输入,估计器会认为类别之间是有序的,但实际却是无序的。(例如:浏览器的类别数据则是任意排序的)。
批处理实现:多标签
if __name__ == "__main__": set_ ='multi_label.csv' label=input_fn(set_) print(label) length = len(label) num =12 #label_one_hot=np.zeros([length, num]) enc = preprocessing.OneHotEncoder() enc.fit(label) label_one_hot = enc.transform(label).toarray() print(label_one_hot)
def text2vec(text): text_len = len(text) if text_len > MAX_CAPTCHA: raise ValueError('验证码最长4个字符') vector = np.zeros(MAX_CAPTCHA*CHAR_SET_LEN) def char2pos(c): if c =='_': k = 62 return k k = ord(c)-48 if k > 9: k = ord(c) - 55 if k > 35: k = ord(c) - 61 if k > 61: raise ValueError('No Map') return k for i, c in enumerate(text): idx = i * CHAR_SET_LEN + char2pos(c) vector[idx] = 1 return vector
def dense_to_one_hot(labels_dense, num_classes): " Convert class labels from scalars to one-hot vectors.""" number_labels=labels_dense.shape[0] index_offset=np.arange(number_labels)*num_classes labels_one_hot=np.zeros((number_labels, num_classes)) labels_one_hot.flat[index_offset+labels_dense.ravel()] = 1 return labels_one_hot