Я пытаюсь преобразовать пороговый массив (Pickle файла изоляции леса из Scikit Learn) типа из Float64 в Float32

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, кто-нибудь имел какое-либо решение этой проблемы?

16
Akshay Tilekar 30 Авг 2017 в 11:09

3 ответа

Лучший ответ

На самом деле я старался изо всех сил, но не смог сделать, так как объекты 'sklearn.tree._tree.Tree' не доступны для записи.

Это вызывает проблему точности при генерации файла PMML, поэтому я поднял ошибку там, и они дали обновленное решение для него, не преобразовывая его в Float64 внутри.

Для получения дополнительной информации, вы можете перейти по этой ссылке: Проблема точности

1
Akshay Tilekar 8 Ноя 2017 в 06:54

Проблема в том, что вы не выполняете никакого преобразования типов массива numpy. Вы вычисляете переменную float32 и помещаете ее как запись в массив nupy float64. 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'>

В вашем случае это массив tree.tree_.threshold

16
dmonaldo 8 Апр 2018 в 00:04

Вы можете попробовать это:

tree.tree_.threshold[i]=tree.tree_.threshold[i].astype('float32',casting='same_kind’)
0
Michael Myers 17 Ноя 2017 в 03:22