Решение уравнений с двумя переменными с использованием линейной регрессии - PullRequest
1 голос
/ 17 июня 2020

У меня есть проблема для x и y, решающая с помощью нескольких уравнений. У меня разные точки данных (в количестве кадров), а именно:

  • Группа 1: 1003, 145, 1344, 66, 171, 962

  • Группа 2: 602, 140, 390, 1955, 289, 90

Общее количество часов у меня следующее:

  • Общее количество часов: 1999, 341, 1151, 2605, 568, 864

Я установил они складываются в разные уравнения, например:

1003x + 602y = 1999 145x + 140y = 341 и т. д.

Я хотел бы найти оптимальные значения для x и y, которые делают все уравнения как можно ближе к правда, насколько это возможно.


Я пробовал линейную регрессию в Python, чтобы извлечь данные, но я не уверен, иду ли я по правильному пути или нет.

Здесь это мой код в Python:

dataset = pd.read_csv(r"C:\Users\path\to\.csv")

X = dataset[['Group 1 Frames', 'Group 2 Frames']]
y = dataset['Total Hours']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.25, random_state=0)

regressor = LinearRegression()
regressor.fit(X_train, y_train)

coeff_df = pd.DataFrame(regressor.coef_, X.columns, columns=['Coefficient'])
coeff_df

Теперь это дает мне два разных значения: 1.3007 и 1.2314. После расчета средней абсолютной ошибки и среднеквадратичной ошибки кажется, что результаты показывают, что числа неточны и непригодны для использования.

Есть ли способ более точно рассчитать желаемые значения x и y?


Мои мысли относительно ошибки:

  1. Мой метод (я очень новичок в python и данных анализ подобный этому, поэтому я делаю большие ставки на этот)
  2. Отсутствие точек данных (я могу собрать больше)
  3. x и y не имеют хороших отношений с Total Hours, отсюда большая ошибка

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Сильно заимствуя у ответ @ Zeek ,

import pandas as pd
import numpy as np

g1=np.array([1003, 145, 1344, 66, 171, 962])
g2=np.array([602, 140, 390, 1955, 289, 90])
th=np.array([1999, 341, 1151, 2605, 568, 864])
dataset = pd.DataFrame({'Group 1 Frames':g1,'Group 2 Frames':g2,'Total Hours':th})
X = dataset[['Group 1 Frames', 'Group 2 Frames']]
y = dataset['Total Hours']

from sklearn import linear_model

reg = linear_model.LinearRegression()
reg.fit(X,y)

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig=plt.figure()
ax=fig.add_subplot(111,projection='3d')
ax.scatter3D(X['Group 1 Frames'],X['Group 2 Frames'],y,c='blue')
ax.scatter3D(X['Group 1 Frames'],X['Group 2 Frames'],reg.predict(X),c='red')

ax.set_xlabel('Group 1 Frames')
ax.set_ylabel('Group 2 Frames')
ax.set_zlabel('Total Hours')

plt.show()

дает:

In [2]: reg.coef_                                                                                                                                         
Out[2]: array([0.65638179, 1.29127836])

In [3]: reg.intercept_                                                                                                                                    
Out[3]: 104.95400059973235

и:

введите описание изображения здесь

... что неплохо, за исключением первой и третьей выборок данных. В зависимости от ваших требований к прогнозу это может быть или не быть достаточно хорошим. Может быть, некоторые из ваших данных нуждаются в "массировании"?

0 голосов
/ 17 июня 2020

Я пробовал твой пример. Вот мои наблюдения и предложения.

1) Вы не обучаете свою модель на достаточном количестве данных. => Я попытался вставить пару случайных точек данных в ваш DF, и оценка сместилась с -27.xx на -0,10. Это показывает, что вам нужно больше данных для обучения.

2) Используйте масштабатор (например, StandardScaler) для масштабирования точек данных, прежде чем фактически использовать .fit для размещения ваших данных в regressor. Это позволит масштабировать ваши точки данных так, чтобы они имели среднее значение 0 и стандартное отклонение 1.

После выполнения вышеупомянутых 1 и 2 я получил оценку -0.10xx (намного лучше, чем исходное -27.xx) и coeff 282.974346 и 759.690447 для группы 1 и группы 2 соответственно

Вот мой код для справки, который я пробовал:

(ЭТО СОДЕРЖИТ ЭТИ ФАКТИЧЕСКИЕ ДАННЫЕ, КОТОРЫЕ Я ВСТАВЛЕН СЛУЧАЙНО (последние 4 точки данных в каждой группе))

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import matplotlib.pyplot as plt

g1=np.array([1003, 145, 1344, 66, 171, 962,100,200,300,400])
g2=np.array([602, 140, 390, 1955, 289, 90,80,170,245,380])

th=np.array([1999, 341, 1151, 2605, 568, 864,1000,300,184,411])

dataset = pd.DataFrame({'Group 1 Frames':g1,'Group 2 Frames':g2,'Total Hours':th})

X = dataset[['Group 1 Frames', 'Group 2 Frames']]
# print(X)
y = dataset['Total Hours']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.25, random_state=0)

pipeline=Pipeline([('norm', StandardScaler()), ('linreg', LinearRegression())])

pipeline.fit(X_train, y_train)

print(pipeline.score(X_test,y_test))

y_pred=pipeline.predict(X_test)

fig,ax=plt.subplots()
ax.plot(X_test,y_test,label='Actual')
ax.plot(X_test,y_pred,label='Predicted')

ax.legend()
plt.show()

coeff_df = pd.DataFrame(pipeline['linreg'].coef_, X.columns, columns=['Coefficient'])
print(coeff_df)

ЗДЕСЬ Я ТАКЖЕ ЗАПИСИЛ ПРЕДПОЛАГАЕМЫЕ ДАННЫЕ С ФАКТИЧЕСКИМИ ДАННЫМИ ИСПЫТАНИЙ enter image description here

...