Линия регрессии - PullRequest
       4

Линия регрессии

1 голос
/ 29 февраля 2020

Я пытаюсь построить линию регрессии на диаграмме рассеяния, основываясь на моих предсказанных данных.

Проблема в том, что я должен получить одну линию, но на моем графике много линий, соединяющих все точки (см. Рисунок) https://i.stack.imgur.com/VF483.png

После прогнозирования Выбросы CO2, основанные на других данных, я строю график размера двигателя в сравнении с фактическими данными теста (выбросы СО2), и я пытаюсь построить график зависимости размера двигателя от прогнозируемых данных теста, но я не могу .

Вот код:

#import the dataset
df = pd.read_csv('FuelConsumptionCo2.csv')
cols = ['ENGINESIZE','CYLINDERS','FUELTYPE','FUELCONSUMPTION_CITY','FUELCONSUMPTION_HWY','FUELCONSUMPTION_COMB','CO2EMISSIONS']

#create new dataset with colums neeeded
cdf = df[cols]
#dummies for the categorigal column fueltype
cdf = pd.get_dummies(cdf,'FUELTYPE')

#the features without the target column
selFeatures = list(cdf.columns.values)
del selFeatures[5]


#split the dataset for fitting
X_train, X_test, Y_train, Y_test = train_test_split(cdf[selFeatures], cdf['CO2EMISSIONS'], test_size=0.5)

#regression model
clfregr = linear_model.LinearRegression()

#train the model
clfregr.fit(X_train, Y_train)

#predict the values
train_pred = clfregr.predict(X_train)
test_pred = clfregr.predict(X_test)

#regression line for the predicted in test
plt.scatter(X_test.ENGINESIZE,Y_test,  color='gray')
plt.plot(X_test.ENGINESIZE, test_pred, color='red', linewidth=1)
plt.show()

Ответы [ 4 ]

4 голосов
/ 29 февраля 2020

Проблема в том, что вы делаете множественную линейную регрессию. Вы должны ожидать прямую линию, если размер двигателя равен только коэффициент , влияющий на выбросы CO2. Но есть и другие факторы. Если у вас есть 2 независимых переменных, вы получите плоскость в 3D. Если у вас есть n переменных, вы должны ожидать линейную форму в n-мерном пространстве metri c.

3 голосов
/ 29 февраля 2020

Вы можете применить этот код для построения регрессионной модели

model = linear_model.LinearRegression()
x_train = np.asanyarray(df[['ENGINESIZE']])
y_train = np.asanyarray(df[['CO2EMISSIONS']])
model.fit (x_train, y_train)


plt.scatter(df['ENGINESIZE'], df["CO2EMISSIONS"], color='blue')
plt.plot(x_train, model.coef_[0][0]*x_train + model.intercept_[0], color='red')

enter image description here

2 голосов
/ 29 февраля 2020

В данных 9 независимых переменных. Поэтому при построении одного из них вы получите дубликаты на значение ENGINESIZE. Это не приводит к функции построения графика. Когда вы пытаетесь нарисовать линию, она будет зигзагообразно между этими множественными вертикальными точками.

enter image description here

Обратите внимание, когда мы делаем scatterplot на наших прогнозах многие в одной вертикальной линии - соответствуют различным значениям других восьми независимых переменных, чем та, которую вы наносите на x-axis:

 plt.scatter(X_test.ENGINESIZE, test_pred, color='yello') # , linewidth=1)

enter image description here

Я скажу - класс sklearn LinearRegression довольно сложен в использовании. Я использовал statsmodels вместо

plt.scatter(X_test.ENGINESIZE,Y_test,  color='gray')
import statsmodels.formula.api  as smf
y = Y_train
X = X_train
df = pd.DataFrame({'x' : X.ENGINESIZE, 'y': y})
smod = smf.ols(formula ='y~ x', data=df)
result = smod.fit()
plt.plot(df['x'], result.predict(df['x']), color='red', linewidth=1)
plt.show()

enter image description here

Тогда для дополнительного кредита

print(result.summary())

enter image description here

2 голосов
/ 29 февраля 2020

Попробуйте извлечь наклон (m) и точку пересечения (b) линии регрессии из вашей функции LinearRegression(), а затем используйте

plt.plot(X_test.ENGINESIZE, m*X_test.ENGINESIZE + b, 'r', linewidth=1)

или используйте lmplot Морского Рога или regplot функция.

...