Неправильный индекс панд, вызывающий проблемы с вычитанием - PullRequest
0 голосов
/ 22 ноября 2018

Я должен начать с того, что я довольно плохо знаком с пандами и numpy (и с машинным обучением в целом).

Я пытаюсь выучить некоторые базовые алгоритмы машинного обучения и делаю линейную регрессию.Я выполнил эту задачу, используя matlab, но хотел попробовать реализовать ее на python - так как это более практичный язык.Мне очень трудно выполнять базовые матричные операции с этими библиотеками, и я думаю, что это связано с отсутствием понимания того, как pandas индексирует информационный фрейм ...

Я нашел несколько постов, рассказывающих о различиях междуiloc и ix и этот ix устарели, так что используйте iloc, но iloc вызывает у меня массу проблем.Я просто пытаюсь вытянуть первые n-1 столбцы из фрейма данных в новый фрейм данных, а затем последний столбец в другой фрейм данных, чтобы получить значения моей метки.Затем я хочу выполнить функцию стоимости один раз, чтобы увидеть, какова моя текущая стоимость с theta = 0. В настоящее время мой набор данных имеет только одну метку - но я бы хотел закодировать, как если бы у меня было больше.Вот мой код и мой вывод:

path = os. getcwd() + '\\ex1data1.txt'
data = pd.read_csv(path, header=None)

numRows = data.shape[0]
numCols = data.shape[1]

X = data.iloc[:,0:numCols-1].copy()
theta = pd.DataFrame(np.zeros((X.shape[1], 1)))
y = data.iloc[:,-1].copy()

#start computing cost sum((X-theta)-y).^2)
predictions = X.dot(theta)
print("predictions shape: {0}".format(predictions.shape))
print(predictions.head())
print("y shape: {0}".format(y.shape))
print(y.head())

errors = predictions.subtract(y)

print("errors shape: {0}".format(errors.shape))
print(errors.head())

вывод:

predictions shape: (97, 1)
 0
0  0.0
1  0.0
2  0.0
3  0.0
4  0.0
y shape: (97, 1)
     1
0  17.5920
1   9.1302
2  13.6620
3  11.8540
4   6.8233
errors shape: (97, 2)
0   1
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN

Я вижу, что у и Х имеют одинаковую форму, но по какой-то причине, когда я их отображаю - этокажется, что y начинает индексирование в столбце 1 (это исходная позиция в первом кадре данных), а X имеет исходный столбец 0. В результате pandas правильно выполняет вычитание и заменяет все пропущенные значения на NaN.Поскольку у y нет значений столбца 0, все они имеют значение NaN, а поскольку X не имеет значений столбца 1, все они имеют значение NaN, в результате чего получается матрица 97x2 NaN.

Если я использую 101 y = data.ix[:,-1:0] - приведенный выше код выполняет правильные вычисления.Вывод:

 errors shape: (97, 1)
         0
     0 -6.1101
     1 -5.5277
     2 -8.5186
     3 -7.0032
     4 -5.8598

Но я стараюсь держаться подальше от ix, поскольку, как уже было сказано, он устарел.

Как мне сказать pandas, что у новой матрицы есть начальный столбец0 и почему это не поведение по умолчанию?

1 Ответ

0 голосов
/ 22 ноября 2018

Похоже, что вычисления, которые вы на самом деле хотите сделать, относятся к серии (отдельным столбцам).Таким образом, вы должны быть в состоянии сделать:

predictions[0].subtract(y[1])

Чтобы получить желаемое значение.Это выглядит несколько запутанно, потому что у вас есть числа в качестве столбцов DataFrame, вы выбираете нужные столбцы (0 и 1) и выполняете вычитание между ними.

Или используете iloc, как вы изначально предложили, что дает вам большекак индексирование в стиле матрицы, вы можете сделать это:

predictions.iloc[:, 0].subtract(y.iloc[:, 0])

Поскольку в каждом DataFrame вы хотите все строки и столбец first

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...