ディレクトリ
0.はじめに
戻り、分類、クラスタリング、機械学習アルゴリズムにおいて、各特徴間の距離(類似度)の計算は、しかし、それは一般に、コサイン類似度としてユークリッド空間計算距離計算に使用される、非常に重要です。しかし、ユークリッド空間に必要な類似度データを計算することは、継続的な秩序です。多くの機械学習タスクでは、データは、月曜日、火曜日として、離散的である、...日曜日、男性とセックスを持っている女性は、中国の祖国、米国、フランスなどがあります。これらの特性値が連続ではなく、ある離散、順不同。
あなたは機械学習アルゴリズムとして入力したい場合は、我々は通常、デジタル化された機能である必要があります。デジタルそれの特徴は何ですか?例えば:
性别特征:["男","女"]
祖国特征:["中国","美国,"法国"]
运动特征:["足球","篮球","羽毛球","乒乓球"]
どのような魅力は、それをデジタル化していますでしょうか?彼の個人的な特性である[「男」、「中国」、「卓球」]、どのように彼は表していますか?
1.ワンホットエンコーディング
また、Nビット・ステータス・レジスタは、N個の状態を符号化するために他の独立して各レジスタのビットを使用している、コーディング効率的として知られている、すなわちホット符号化ワン・ホット・エンコーディング、およびいつでも、これだけ効果的。カテゴリ変数アルゴリズムを変換するワンホットベクトルの一の形態は、使用機械学習プロセスに容易であり、このベクターは、属性の特徴ベクトルによって表され、すなわち同じ時間だけつの活性点(0でない)、このベクターのみ一つの特徴は、他には特にスパース、0で、0ではありません。
ホットエンコードされた1.1の例
例1:
私たちは、4つのサンプルを持って、各サンプルは、3つの特性などがあります。
特集1 | 特集2 | 特長3 | |
---|---|---|---|
サンプル1 | 1 | 4 | 3 |
サンプル2 | 2 | 3 | 2 |
サンプル3 | 1 | 2 | 2 |
サンプル4 | 2 | 1 | 1 |
男女の代表、女性に代わって2人の男性のためのような1は、4つの特性2、また彼の意味を持っていることと同じ機能3のもう一つの特徴を表すことがある場合は、サンプルの特性1は、2つの可能な値がある訴えます。
ホットは、各サンプルの個々の特性ことを確実にするために符号化され、一つだけ桁はとして符号化、1、すべて0です。
特集1 | 特集2 | 特長3 | |
---|---|---|---|
サンプル1 | 01 | 1000年 | 100 |
サンプル2 | 10 | 0100 | 010 |
サンプル3 | 01 | 0010 | 010 |
サンプル4 | 10 | 0001 | 001 |
ホット機能のそれぞれを表すために符号化された使用は、4ビットを表現する値の二、四種類を表すために使用される特徴量の二種類が存在する
ため、プリアンブル例は、特定の機能と対応する機能があってもよいです。
- 性別特徴:[ "M"、 "F"(2つだけの特徴があり、それはN = 2である):
M => 10
F => 01 - 祖国特性:[ "中国"、 "USA、"フランス語「](N = 3):
中国=> 100
米国=> 010
フランス=> 001 - 運動特性:[ "サッカー"、 "バスケットボール"、 "バドミントン"、 "卓球"(N = 4):
サッカー=、> 1000
バスケットボール=> 0100
バドミントン=> 0010
テニス=> 0001
サンプルである場合よう[「男」、「中国」、「卓球」]デジタル機能の完全な結果は次の通りです:
[1,0,1,0,0,0,0,0,1]
の最初の二つの代表性別、真ん中の3つの代わりに国 4人の代表の後、運動。
ホットエンコードされた利点1.2
- 機械学習アルゴリズム離散固有値悪い治療を処理することができます。
- セックス自体は1つのホット符号化後のスルー機能があるとして、ある程度、次元の機能を高める、など、それが男性か二人の女性の特徴となります。
- 離散的な特徴の値は、欧州空間上の点に対応する離散値によって特徴付け欧州空間まで延びています。離散ワンホットエンコーディング特徴計算の間の距離がより合理的なことがあり、前記使用。
ワンホットエンコーディングの1.3欠点
- オリジナルタグのエンコードを注文された場合、ワンホットコード配列の情報が失われます。
- 固有値の数は、特に、冗長な疎行列の多くが生成されます場合は
- 寸法(単語)との間の関係反映されていないが、各単語は、互いの寸法は無関係ですが、各単語は、この機能は現実に沿ったものではないことが明らかであり、互いとは何の関係もありません。言葉の多数が関連しています。例えば:
- セマンティック:少女と女性、異なる年齢層に使用されるが、しかし平均は女性です。
- 複数:単語と単語の唯一の違いは、複数と単数形です。
- テンス:買いと買って表現は「買い」ですが、異なる時刻に発生しました。
- したがって、ワンホット表現を符号化することにより、上記の特性が考慮されません。
ワンホットエンコーディングの1.4例が適用されます
- ワンホットエンコーディング機能が離散的である場合、データの離散値カテゴリの問題を解決するために使用され、そしてないワンホットエンコーディングは、距離を計算することは非常に合理的なことができ、その後、ワンホットエンコードする必要はありません。
- 、部分的な順序ではありませんいくつかのツリーベースのベクトル空間に基づいていない変数を扱うにおけるアルゴリズム、メトリック値のみカテゴリのシンボル、そのワンホットエンコーディング、ワンホットエンコーディングのためのツリーモデルより少ない必要性は、決定木のために、何もありません。特徴サイズの概念は、本質ワンホットエンコーディングであるという概念の特徴部分だけは、ツリーの深さを大きくすることです。時間GBDTの高次元疎行列効果も低次元疎行列で、良好ではないとして必ずしも良好SVMよりありません。
2.ワンホットエンコード実装
ワンホットエンコーディングの2.1 Pythonの単純な実装
import numpy as np
samples = ['I like playing basketball', 'I played football yesterday morning']
token_index = {}
for sample in samples:
for word in sample.split():
if word not in token_index:
token_index[word] = len(token_index)+1
max_length = 10
results = np.zeros(shape=(len(samples),
max_length,
max(token_index.values())+1))
for i, sample in enumerate(samples):
for j, word in list(enumerate(sample.split()))[:max_length]:
print(j)
index = token_index.get(word)
results[i, j, index] = 1
print(results)
2.2 sklearn
OneHotEncoder sklearn(でホットエンコードを取得するには)が、数値データのみに適用されます。feature_indices_の()OneHotEncoderあなたは、元の列対応を備えているかを知ることができます。
使用numpy.hstack()一緒の変換結果得られる複数の結果ステッチ
の問題を:データを直接符号化された文字列型にすることはできません(LabelEncoder()+ OneHotEncoder()は、データフォーマット変換の対象を実装することができます)
from sklearn import preprocessing
enc = OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1],[1, 0, 2]])
print("enc.n_values_ is:",enc.n_values_)
print("enc.feature_indices_ is:",enc.feature_indices_)
print(enc.transform([[0, 1, 1]]).toarray())
print(enc.transform([[1, 1, 1]]).toarray())
print(enc.transform([[1, 2, 1]]).toarray())
出力結果:
enc.n_values_ is: [2 3 4]
enc.feature_indices_ is: [0 2 5 9] #特征坐标
[[1. 0. 0. 1. 0. 0. 1. 0. 0.]]
[[0. 1. 0. 1. 0. 0. 1. 0. 0.]]
enc.n_values_がある:特徴の数、各特徴量、前記第一の数2、数3は、第3の数は4である第2の特徴です。
enc.feature_indices_は:ワンホットベクトルの範囲内の各機能の表示座標が、第一の特徴は、0-2であり、2-5は第二の特徴である、第三の特徴は、5-9です。
ワンホットエンコーディングに後者の3つの特性値を変換することで、我々はワンホットルック異なるの結果を比較することができます。
2.3ハード
from keras.preprocessing.text import Tokenizer
samples = ['I like playing basketball', 'I played football yesterday morning']
tokenizer = Tokenizer(num_words=1000)
tokenizer.fit_on_texts(samples)
sequences = tokenizer.texts_to_sequences(samples)
one_hot_results = tokenizer.text_to_matrix(samples, mode="binary")
word_index = tokenizer.word_index
print('Found %s unique tokens.' % len(word_index))
2.4 tensorflow
公式文書:
tf.one_hot(
indices,
depth,
on_value=None,
off_value=None,
axis=None,
dtype=None,
name=None
)
Returns a one-hot tensor(返回一个one_hot张量).
The locations represented by indices in indices take value on_value, while all other locations take value off_value.
(由indices指定的位置将被on_value填充, 其他位置被off_value填充).
on_value and off_value must have matching data types. If dtype is also provided, they must be the same data type as specified by dtype.
(on_value和off_value必须具有相同的数据类型).
If on_value is not provided, it will default to the value 1 with type dtype.
If off_value is not provided, it will default to the value 0 with type dtype.
If the input indices is rank N, the output will have rank N+1. The new axis is created at dimension axis (default: the new axis is appended at the end).
(如果indices是N维张量,那么函数输出将是N+1维张量,默认在最后一维添加新的维度).
If indices is a scalar the output shape will be a vector of length depth.
(如果indices是一个标量, 函数输出将是一个长度为depth的向量)
If indices is a vector of length features, the output shape will be:
features x depth if axis == -1.
(如果indices是一个长度为features的向量,则默认输出一个features*depth形状的张量)
depth x features if axis == 0.
(如果indices是一个长度为features的向量,axis=0,则输出一个depth*features形状的张量)
If indices is a matrix (batch) with shape [batch, features], the output shape will be:
batch x features x depth if axis == -1
(如果indices是一个形状为[batch, features]的矩阵,axis=-1(默认),则输出一个batch * features * depth形状的张量)
batch x depth x features if axis == 1
(如果indices是一个形状为[batch, features]的矩阵,axis=1,则输出一个batch * depth * features形状的张量)
depth x batch x features if axis == 0
(如果indices是一个形状为[batch, features]的矩阵,axis=0,则输出一个depth * batch * features形状的张量)
実装:
indices = [0, 1, 2] #输入数据(是个向量)需要编码的索引是[0,1,2]
depth = 3
tf.one_hot(indices, depth) # output: [3 x 3]
# [[1., 0., 0.],
# [0., 1., 0.],
# [0., 0., 1.]]
indices = [0, 2, -1, 1] #输入数据(是个向量)的需要编码的索引是[0,2,-1,1]
depth = 3
tf.one_hot(indices, depth,
on_value=5.0, off_value=0.0,
axis=-1) # output: [4 x 3]
# [[5.0, 0.0, 0.0], # one_hot(0) 对位置0处的数据进行one_hot编码
# [0.0, 0.0, 5.0], # one_hot(2) 对位置2处的数据进行one_hot编码
# [0.0, 0.0, 0.0], # one_hot(-1) 对位置-1处的数据进行one_hot编码
# [0.0, 5.0, 0.0]] # one_hot(1) 对位置1处的数据进行one_hot编码
indices = [[0, 2], [1, -1]] #输入数据是个矩阵
depth = 3
tf.one_hot(indices, depth,
on_value=1.0, off_value=0.0,
axis=-1) # output: [2 x 2 x 3]
# [[[1.0, 0.0, 0.0], # one_hot(0) 对位置(0,0)处的数据进行one_hot编码
# [0.0, 0.0, 1.0]], # one_hot(2) 对位置(0,2)处的数据进行one_hot编码
# [[0.0, 1.0, 0.0], # one_hot(1) 对位置(1,1)处的数据进行one_hot编码
# [0.0, 0.0, 0.0]]] # one_hot(-1) 对位置(1,-1)处的数据进行one_hot编码
ワンホット3 NLP表現
NLPで表現ホットワン過去に非常に人気のある、しかし、TF-IDFの登場と単語ベクトルと、それはゆっくりと、もはや適用となっている、主要な欠点:
- かかわらず、単語と単語の間の順序の(メッセージ・テキスト内の単語の配列も非常に重要です)。
- 互いの単語および単語の独立を仮定すると、各単語の間の距離であります 。(CI、ほとんどの場合、互いに影響を与えます)。
- これは、離散GETスパース、どのように多くの語彙、多くのベクトルの次元であるかによって特徴付けられます。(この問題が最も深刻です)。