#python #numpy #machine-learning #scikit-learn #regression
Вопрос:
Я пытаюсь создать логистическую регрессию с нуля, используя функцию Квадратов потерь. Однако у меня возникла эта ошибка, которую я действительно не могу понять. Ошибка в следующем: не удается умножить последовательность на не-int типа ‘numpy.float64’. Любая помощь будет очень признательна! (да, я знаю, что обленился с коэффициентом.)
def logisticReg(data):
X_train = [(d[0],d[1],d[2]) for d, _ in data]
Y_train = [y for _, y in data]
LogReg = LogisticRegression(random_state=42, solver='sag', penalty='none', max_iter=10000, fit_intercept=False)
LogReg.fit(X_train, Y_train)
w=[round(c,2) for c in LogReg.coef_[0]]
sigmoid = lambda y: 1/(1 np.exp(-y))
classify = lambda y: 1 if y > 0.5 else 0
F = lambda W, X: sum([w*x for w,x in zip(W,X)])
for i in range(len(X_train)):
Function = F(w,X_train)
y_pred = sigmoid(Fucntion)
Data_m = (-2) * sum(x*(y-y_pred))
Data_b = (-2) * sum(y - y_pred)
m = m- L*Data_m #update weights
b = b-L*Data_b
weights = zip(m,b)
print(weights)
data = [((1, 0, 0), 1), ((1, 1, 7), 0), ((1, -3, -2), 0), ((1, 8, 9), 1), ((1, 4, 3), 1), ((1, 5, -2), 1), ((1, 0, 0), 1), ((1, 6, 9), 1), ((1, 4, 2), 1), ((1, 1, -9), 1), ((1, -7, 7), 0), ((1, 0, -1), 1), ((1, 9, -4), 1), ((1, 1, 0), 1), ((1, -2, -5), 1), ((1, 2, 3), 1), ((1, -7, 2), 0), ((1, -3, 0), 0), ((1, 5, 0), 1), ((1, 0, -3), 1), ((1, -2, 3), 0), ((1, 9, 6), 1), ((1, 0, -8), 1), ((1, 0, 2), 0), ((1, -8, 6), 0), ((1, 1, 9), 0), ((1, 0, 5), 0), ((1, -4, 9), 0), ((1, 8, 2), 1), ((1, 2, 6), 0)]
logisticReg(data)
Комментарии:
1. Всякий раз, когда вы сообщаете об ошибке Python, включайте в вопрос полное сообщение об ошибке (т. Е. полную обратную трассировку). Там есть полезная информация (включая строку, в которой возникло исключение).
Ответ №1:
Я обнаружил, что ошибка возникает при вызове функции с именем F.
Я исправил проблему, слегка изменив ваш код.
import numpy as np
import sklearn.linear_model as sk
def logisticReg(data):
X_train = [(d[0], d[1], d[2]) for d, _ in data]
Y_train = [y for _, y in data]
LogReg = sk.LogisticRegression(random_state=42, solver='sag', penalty='l2', max_iter=10000, fit_intercept=False)
LogReg.fit(X_train, Y_train)
w=[round(c,2) for c in LogReg.coef_[0]]
sigmoid = lambda y: 1/(1 np.exp(-y))
thresh = lambda y: 1 if y > 0.5 else 0
F = lambda W, X: sum([w*x for w,x in zip(np.array(W), np.array(X))])
for i in range(len(X_train)):
res = F(w, X_train)
y_pred = sigmoid(res)
# Data_m = (-2) * sum(x*(y - y_pred))
# Data_b = (-2) * sum(y - y_pred)
# m = m - L*Data_m
# b = b - L*Data_b
# weights = zip(m,b)
# print(weights)
return(None)
data = [((1, 0, 0), 1), ((1, 1, 7), 0), ((1, -3, -2), 0), ((1, 8, 9), 1), ((1, 4, 3), 1), ((1, 5, -2), 1), ((1, 0, 0), 1), ((1, 6, 9), 1), ((1, 4, 2), 1), ((1, 1, -9), 1), ((1, -7, 7), 0), ((1, 0, -1), 1), ((1, 9, -4), 1), ((1, 1, 0), 1), ((1, -2, -5), 1), ((1, 2, 3), 1), ((1, -7, 2), 0), ((1, -3, 0), 0), ((1, 5, 0), 1), ((1, 0, -3), 1), ((1, -2, 3), 0), ((1, 9, 6), 1), ((1, 0, -8), 1), ((1, 0, 2), 0), ((1, -8, 6), 0), ((1, 1, 9), 0), ((1, 0, 5), 0), ((1, -4, 9), 0), ((1, 8, 2), 1), ((1, 2, 6), 0)]
logisticReg(data)
Однако вам следует переосмыслить то, что должен делать ваш алгоритм, потому что это кажется неясным: вы хотите закодировать алгоритм логистической регрессии с нуля, но используете алгоритм sklearn для вычисления значений коэффициентов модели для данного набора данных, а затем, похоже, используете эти коэффициенты в цикле for…
Что вам следует сделать в своей функции логистической регрессии, так это вычислить коэффициенты модели логистической регрессии, примененной к данному набору данных, вообще не используя sklearn. А затем вы можете вызвать свою собственную логистическую регрессию для данного набора данных, чтобы получить коэффициенты и сравнить их с коэффициентами, вычисленными с помощью логистической регрессии от sklearn.
Полезная ссылка на документацию о подгонке модели логистической регрессии: https://en.wikipedia.org/wiki/Logistic_regression#Model_fitting