web-dev-qa-db-ja.com

numpy配列のタイプと値をFloat64からFloat32に変換します

Float64からFloat32にタイプのしきい値配列(scikitからの分離フォレストのピクルファイルを学ぶ)を変換しようとしています

for i in range(len(tree.tree_.threshold)):
    tree.tree_.threshold[i] = tree.tree_.threshold[i].astype(np.float32)

その後、印刷する

for value in tree.tree_.threshold[:5]:
    print(type(value))
    print(value)

私が得ている出力は次のとおりです:

<class 'numpy.float64'>
526226.0
<class 'numpy.float64'>
91.9514312744
<class 'numpy.float64'>
3.60330319405
<class 'numpy.float64'>
-2.0
<class 'numpy.float64'>
-2.0

Float32に適切に変換されません。値とその型をFloat32に変換したいのですが、これを回避する方法はありますか?

12
Akshay Tilekar

実際、私は一生懸命努力しましたが、「sklearn.tree._tree.Tree」オブジェクトは書き込み可能でないため、できませんでした。

それはPMMLファイルの生成中に精度の問題を引き起こしているので、そこにバグを上げて、彼らはそれを内部でFloat64に変換しないことによって、それに対する更新されたソリューションを提供しました。

詳細については、このリンクをたどることができます: Precision Issue

1
Akshay Tilekar

問題は、numpy配列の型変換を行わないことです。 float32変数を計算し、float64 numpy配列へのエントリとして配置します。 numpyはそれを適切にfloat64に変換します

次のようにしてみてください:

a = np.zeros(4,dtype="float64") 
print a.dtype
print type(a[0])
a = np.float32(a)
print a.dtype
print type(a[0])

出力(python 2.7でテスト済み)

float64
<type 'numpy.float64'>
float32
<type 'numpy.float32'>

aはあなたの場合、配列tree.tree_.thresholdです

11
Glostas

これを試すことができます:

tree.tree_.threshold[i]=tree.tree_.threshold[i].astype('float32',casting='same_kind’)
0
Woody