Преобразователь ожидает двумерный массив формы (nxm), где n - количество выборок, а m - число объектов, и если вы посмотрите на форму features
, я представлю, что она отобразит: (m,)
. [ 1119]
Изменение формы массивов
В общем случае для массива объектов формы (n,)
вы можете сделать так, как предлагает код ошибки, и вызвать .reshape(-1,1)
в вашем массиве объектов, -1 позволяет ему выводить дополнительное измерение: форма массива будет (n,m)
, где для случая 1 признака m = 1
.
Склеарн-трансформеры
Выше сказанное, я думаю, есть дополнительные ошибки в вашем коде и понимании.
Я бы напечатал features
на экране и проверил, что это то, что вам нужно, похоже, вы печатаете список всех имен столбцов, кроме sale_price
. Я не знаком с SelectKBest , но для него требуется массив (n,m)
Feature , а не список имен столбцов объектов.
Кроме того, target
должно быть не именем целевого столбца, а массивом формы (n,)
, где его значения являются наблюдаемыми целевыми значениями обучающих экземпляров.
Я бы посоветовал проверить документацию (на которую ранее ссылались), пока вы пишете свой код, чтобы убедиться, что вы используете правильные аргументы и используете функцию по назначению.
Извлечение функций
Ваши данные выглядят в странном формате (словарь вложен в DF-файл pandas). Тем не менее, это явный пример того, как я мог бы извлечь функции из pd.DataFrame
для использования с функциями из среды SKlearn.
housing_data = pd.DataFrame({'age': [1,5,1,10], 'size':[0,1,2,0],
'price':[190,100,50,100]
})
feature_arr = housing_data.drop('price', axis=1).values
target_values = housing_data['price']
Распечатайте feature_arr
и, надеюсь, увидите свою проблему. Обычно тогда вам нужно предварительно обработать данные, чтобы, например, сбросить значения NaN или выполнить масштабирование объекта.
Алекс абсолютно прав, более эффективно сделать это следующим образом:
from array import array
output_file = open('file', 'wb')
float_array = array('d', [3.14, 2.7, 0.0, -1.0, 1.1])
float_array.tofile(output_file)
output_file.close()
А затем прочитать массив следующим образом:
input_file = open('file', 'rb')
float_array = array('d')
float_array.fromstring(input_file.read())
У объектов array.array
также есть метод .fromfile
, который можно использовать для чтения файла, если вы заранее знаете количество элементов (например, из размера файла или какого-либо другого механизма). )
Я не уверен, как NumPy будет сравнивать с точки зрения производительности для вашего приложения, но, возможно, стоит исследовать.
Использование NumPy :
from numpy import array
a = array(floats,'float32')
output_file = open('file', 'wb')
a.tofile(output_file)
output_file.close()
также приводит к 20-байтовому файлу.
Модуль массива в стандартной библиотеке может быть более подходящим для этой задачи, чем модуль struct, который предлагают все. Производительность с 200 МБ данных должна быть существенно выше с массивом.
Если вы хотите использовать различные варианты, попробуйте профилировать вашу систему с примерно так
См .: Структурный модуль Python
import struct
s = struct.pack('f'*len(floats), *floats)
f = open('file','wb')
f.write(s)
f.close()