用Python 来做Linear Regression

直接就进入代码环节了哈!由于我在pycharm 上写的代码有点长,展示的结果有点很多。为了给各位看的清楚,就分段进行展示程序和结果

这是头文件需要的库

import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
import seaborn as sns
sns.set()

第一部分:程序+结果

raw_data = pd.read_csv('1.04. Real-life example.csv')
print(raw_data.head())
print("*******")

在这里插入图片描述

第二部分:(紧跟着上面部分的)

print(raw_data.describe(include='all'))
print("*******")

在这里插入图片描述

第三部分:

data = raw_data.drop(['Model'],axis=1)
print(data.describe(include='all'))
print("*******")

在这里插入图片描述

第四部分:

print(data.isnull().sum())
print("*******")

在这里插入图片描述

第五部分:

data_no_mv = data.dropna(axis=0)
print(data_no_mv.describe(include='all'))
print("*******")

在这里插入图片描述

第六部分:

q = data_no_mv['Price'].quantile(0.99)
data_1 = data_no_mv[data_no_mv['Price']<q]
print(data_1.describe(include='all'))
print("*******")

在这里插入图片描述

第七部分:

sns.distplot(data_no_mv['Price'])
plt.show()
print("*******")

在这里插入图片描述

第八部分:

sns.distplot(data_1['Price'])
plt.show()
print("*******")

在这里插入图片描述

第九部分:

sns.distplot(data_no_mv['Mileage'])
plt.show()
print("*******")

在这里插入图片描述

第十部分:

data_3 = data_1[data_1['EngineV']<6.5]
sns.distplot(data_3['EngineV'])
plt.show()
print("*******")

在这里插入图片描述

第十一部分:

sns.distplot(data_no_mv['Year'])
plt.show()
print("*******")

在这里插入图片描述

第十二部分:

q = data_3['Year'].quantile(0.01)
data_4 = data_3[data_3['Year']>q]
sns.distplot(data_4['Year'])
plt.show()
print("*******")

在这里插入图片描述

第十三部分:

data_cleaned = data_4.reset_index(drop=True)
print(data_cleaned.describe(include='all'))
print("*******")

在这里插入图片描述

第十四部分:

f, (ax1, ax2, ax3) = plt.subplots(1,3,sharey=True, figsize=(15,3))
ax1.scatter(data_cleaned['Year'], data_cleaned['Price'])
ax1.set_title('Price and Year')
ax2.scatter(data_cleaned['EngineV'], data_cleaned['Price'])
ax2.set_title('Price and EngineV')
ax3.scatter(data_cleaned['Mileage'], data_cleaned['Price'])
ax3.set_title('Price and Mileage')
plt.show()
print("*******")

在这里插入图片描述

第十五部分:

sns.distplot(data_cleaned['Price'])
plt.show()
print("*******")

在这里插入图片描述

第十六部分:

log_price = np.log(data_cleaned['Price'])
data_cleaned['log_price'] = log_price
print(data_cleaned)
print("*******")

在这里插入图片描述

第十七部分:

f, (ax1, ax2, ax3) = plt.subplots(1,3,sharey=True, figsize=(15,3))
ax1.scatter(data_cleaned['Year'], data_cleaned['log_price'])
ax1.set_title('Log Price and Year')
ax2.scatter(data_cleaned['EngineV'], data_cleaned['log_price'])
ax2.set_title('Log Price and EngineV')
ax3.scatter(data_cleaned['Mileage'], data_cleaned['log_price'])
ax3.set_title('Log Price and Mileage')
plt.show()
print("*******")

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第十八部分:

# Multicollinearity
from statsmodels.stats.outliers_influence import variance_inflation_factor
variables = data_cleaned[['Mileage', 'Year', 'EngineV']]
vif = pd.DataFrame()
vif["VIF"] = [variance_inflation_factor(variables.values, i) for i in range(variables.shape[1])]
vif["features"] = variables.columns
print(vif)  # vif = 1: no multicollinearity        1<vif<5: perfectly okay      5<vif: unacceptable
print("*******")

在这里插入图片描述

第十九部分:

data_no_multicollinearity = data_cleaned.drop(['Year'], axis=1)
# Create dummy variables
data_with_dummies = pd.get_dummies(data_no_multicollinearity, drop_first=True)
print(data_with_dummies.head())
print("*******")

在这里插入图片描述

第二十部分:

print(data_with_dummies.columns.values)
print("*******")

在这里插入图片描述

第二十一部分:

cols = ['log_price', 'Mileage', 'EngineV', 'Brand_BMW', 'Brand_Mercedes-Benz',
 'Brand_Mitsubishi', 'Brand_Renault', 'Brand_Toyota', 'Brand_Volkswagen',
 'Body_hatch', 'Body_other', 'Body_sedan', 'Body_vagon', 'Body_van',
 'Engine Type_Gas', 'Engine Type_Other', 'Engine Type_Petrol',
 'Registration_yes']
data_preprocessed = data_with_dummies[cols]
print(data_preprocessed.head())
print("*******")

在这里插入图片描述

第二十二部分:

# Linear regression model
targets = data_preprocessed['log_price']
inputs = data_preprocessed.drop(['log_price'], axis=1)

# Scale the data
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(inputs)
inputs_scaled = scaler.transform(inputs)

# Train Test Split
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(inputs_scaled, targets, test_size=0.2, random_state=365)

# Create the regression
reg = LinearRegression()
reg.fit(x_train, y_train)
y_hat = reg.predict(x_train)
plt.scatter(y_train, y_hat)
plt.xlabel("Targets (y_train)")
plt.ylabel("Predictions")
plt.xlim(6,13)
plt.ylim(6,13)
plt.show()
print("*******")

在这里插入图片描述

第二十三部分:

sns.distplot(y_train - y_hat)
plt.title("Residuals PDF")
plt.show()
print("*******")

在这里插入图片描述

第二十四部分:

reg.score(x_train, y_train)

# finding the weights and bias
reg_summary = pd.DataFrame(inputs.columns.values, columns=['Features'])
reg_summary['Weight'] = reg.coef_
print(reg_summary)
print("*******")
data_cleaned['Brand'].unique()

""""
Weight interpretation
1. Continuous variables:
  (1) A positive weight shows that as a feature increases in value, so do the log_price, and 'Price' respectively
  (2) A negative weight shows that as a feature increases in value, log_price and 'Price' decrease

2. Dummy variables:
  (1) A positive weight shows that the respective category (Brand) is more expensive than the benchmark (Audi)
  (2) A negative weight shows that the respective category (Brand) is less expensive than the benchmark (Audi)

The bigger the weight, the bigger the impact
"""

在这里插入图片描述

第二十五部分:

# Testing
y_hat_test = reg.predict(x_test)
plt.scatter(y_test, y_hat_test, alpha=0.2)  # The more saturated the color, the higher the concentration
plt.xlabel("Targets (y_test)", size = 18)
plt.ylabel("Predictions (y_hat_test)", size = 18)
plt.xlim(6,13)
plt.ylim(6,13)
plt.show()
print("*******")

在这里插入图片描述

第二十六部分:

df_pf = pd.DataFrame(np.exp(y_hat_test), columns=['Prediction'])
print(df_pf.head())
print("*******")

在这里插入图片描述

第二十七部分:

df_pf['Target'] = np.exp(y_test)

df_pf['Residual'] = df_pf['Target'] - df_pf['Prediction']
df_pf['Difference%'] = np.absolute(df_pf['Residual'] / df_pf['Target'] * 100)
print(df_pf)
print("*******")

在这里插入图片描述

第二十八部分:

pd.options.display.max_rows = 999
pd.set_option('display.float_format', lambda x: '%.2f' %x)
print(df_pf.sort_values(by=['Difference%']))
print("*******")

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果觉得博主写的不错,就给个赞吧!博主可是花了很久来整理的。你们的点赞是对博主最大支持!

猜你喜欢

转载自blog.csdn.net/BSCHN123/article/details/103732387