Получение пустого графика при построении графика зависимости затрат от эпохи для многомерной модели линейной регрессии

#python #pandas #numpy #machine-learning #linear-regression

#python #pandas #numpy #машинное обучение #линейная регрессия

Вопрос:

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

Вот мой набор данных

Ссылка на мой код jupyter notebook

Вот мой код

  In [2]:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

In [3]:

temp = pd.read_csv('car_price.csv')

In [4]:

temp.columns

Out[4]:

Index(['name', 'year', 'selling_price', 'km_driven', 'fuel', 'seller_type',
       'transmission', 'owner', 'mileage', 'engine', 'max_power', 'torque',
       'seats'],
      dtype='object')

In [5]:

data = temp[['year', 'selling_price', 'km_driven', 'fuel', 'seller_type',
       'transmission', 'owner', 'mileage', 'engine', 'max_power', 'torque',
       'seats'
            ]]
In [6]:

data['Current_Year'] = 2020

In [7]:

data.head()

Out[7]:

year    selling_price   km_driven   fuel    seller_type transmission    owner   mileage engine  max_power   torque  seats   Current_Year
0   2014    450000  145500  Diesel  Individual  Manual  First Owner 23.4 kmpl   1248 CC 74 bhp  190Nm@ 2000rpm  5.0 2020
1   2014    370000  120000  Diesel  Individual  Manual  Second Owner    21.14 kmpl  1498 CC 103.52 bhp  250Nm@ 1500-2500rpm 5.0 2020
2   2006    158000  140000  Petrol  Individual  Manual  Third Owner 17.7 kmpl   1497 CC 78 bhp  12.7@ 2,700(kgm@ rpm)   5.0 2020
3   2010    225000  127000  Diesel  Individual  Manual  First Owner 23.0 kmpl   1396 CC 90 bhp  22.4 kgm at 1750-2750rpm    5.0 2020
4   2007    130000  120000  Petrol  Individual  Manual  First Owner 16.1 kmpl   1298 CC 88.2 bhp    11.5@ 4,500(kgm@ rpm)   5.0 2020
In [8]: 

data['# Years'] = data['Current_Year'] - data['year']

In [9]:

to_drop = ['Current_Year','year','torque','max_power','seller_type','owner']
data.drop(to_drop, inplace = True, axis = 1)

In [10]:

data.head()

Out[10]:
selling_price   km_driven   fuel    transmission    mileage engine  seats   # Years
0   450000  145500  Diesel  Manual  23.4 kmpl   1248 CC 5.0 6
1   370000  120000  Diesel  Manual  21.14 kmpl  1498 CC 5.0 6
2   158000  140000  Petrol  Manual  17.7 kmpl   1497 CC 5.0 14
3   225000  127000  Diesel  Manual  23.0 kmpl   1396 CC 5.0 10
4   130000  120000  Petrol  Manual  16.1 kmpl   1298 CC 5.0 13

In [11]:
data['engine']= data['engine'].str.replace('[^d.]', '',regex = True).astype(float)

In [12]:
data['mileage'] = data['mileage'].str.replace('[^d.]', '',regex = True).astype(float)

In [13]:
data.head()

Out[13]:
selling_price   km_driven   fuel    transmission    mileage engine  seats   # Years
0   450000  145500  Diesel  Manual  23.40   1248.0  5.0 6
1   370000  120000  Diesel  Manual  21.14   1498.0  5.0 6
2   158000  140000  Petrol  Manual  17.70   1497.0  5.0 14
3   225000  127000  Diesel  Manual  23.00   1396.0  5.0 10
4   130000  120000  Petrol  Manual  16.10   1298.0  5.0 13

In [14]:
data.replace(to_replace = ['Diesel','Petrol','LPG','CNG'],value=[1,2,3,4],inplace = True)

In [15]:
data.head()

Out[15]:
selling_price   km_driven   fuel    transmission    mileage engine  seats   # Years
0   450000  145500  1   Manual  23.40   1248.0  5.0 6
1   370000  120000  1   Manual  21.14   1498.0  5.0 6
2   158000  140000  2   Manual  17.70   1497.0  5.0 14
3   225000  127000  1   Manual  23.00   1396.0  5.0 10
4   130000  120000  2   Manual  16.10   1298.0  5.0 13

In [16]:
data.replace(to_replace = ['Manual','Automatic'],value=[1.0,2.0],inplace = True)

In [17]:
data.head()

Out[17]:
selling_price   km_driven   fuel    transmission    mileage engine  seats   # Years
0   450000  145500  1   1.0 23.40   1248.0  5.0 6
1   370000  120000  1   1.0 21.14   1498.0  5.0 6
2   158000  140000  2   1.0 17.70   1497.0  5.0 14
3   225000  127000  1   1.0 23.00   1396.0  5.0 10
4   130000  120000  2   1.0 16.10   1298.0  5.0 13

In [18]:
data.head()

Out[18]:
selling_price   km_driven   fuel    transmission    mileage engine  seats   # Years
0   450000  145500  1   1.0 23.40   1248.0  5.0 6
1   370000  120000  1   1.0 21.14   1498.0  5.0 6
2   158000  140000  2   1.0 17.70   1497.0  5.0 14
3   225000  127000  1   1.0 23.00   1396.0  5.0 10
4   130000  120000  2   1.0 16.10   1298.0  5.0 13
In [ ]:

In [21]:
data = (data - data.mean())/data.std()



X = data.iloc[:,1:8]

ones = np.ones([X.shape[0],1])
X = np.concatenate((ones,X),axis=1)

y = data.iloc[:,0:1].values 
theta = np.zeros([1,8])

print(X)





def computeCost(X,y,theta):
    tobesummed = np.power(((X @ theta.T)-y),2)
    return np.sum(tobesummed)/(2 * len(X))

def gradientDescent(X,y,theta,iters,alpha):
    cost = np.zeros(iters)
    for i in range(iters):
        theta = theta - (alpha/len(X)) * np.sum(X * (X @ theta.T - y), axis=0)
        cost[i] = computeCost(X, y, theta)
        
    
    return theta,cost


alpha = 0.01
iters = 1000

g,cost = gradientDescent(X,y,theta,iters,alpha)
print(g)

finalCost = computeCost(X,y,g)
print(finalCost)


 
fig, ax = plt.subplots()  
ax.plot(np.arange(iters), cost, 'r')  
ax.set_xlabel('Iterations')  
ax.set_ylabel('Cost')  
ax.set_title('Error vs. Training Epoch')

[[ 1.          1.33828022 -0.86972865 ... -0.41797619 -0.43426926
  -0.04846121]
 [ 1.          0.88735626 -0.86972865 ...  0.07813794 -0.43426926
  -0.04846121]
 [ 1.          1.24102211  0.95315801 ...  0.07615349 -0.43426926
   1.92965648]
 ...
 [ 1.          0.88735626 -0.86972865 ... -0.41797619 -0.43426926
   1.18786235]
 [ 1.         -0.79255652 -0.86972865 ... -0.12427662 -0.43426926
   0.1988035 ]
 [ 1.         -0.79255652 -0.86972865 ... -0.12427662 -0.43426926
   0.1988035 ]]

[[nan nan nan nan nan nan nan nan]]
nan

Out[21]:
Text(0.5, 1.0, 'Error vs. Training Epoch')

In [ ]:
 

При построении графика зависимости затрат от эпохи я получаю пустой график, а при печати значений затрат я получаю данные, в которых отсутствует ‘nan’

Кажется, я не могу понять, где я ошибаюсь.

Комментарии:

1.Можете ли вы удалить In [*]: Out [*]: , отделить журнал от кода и записать его? Фактический код должен быть написан так, чтобы его было легко воспроизвести.

Ответ №1:

Всего в ваших данных было 663 нулевых значения и, следовательно, ошибка,

 data.isnull().values.sum()
663
 

Выполнил среднее вменение и заменил все NAN.

 data = data.fillna(data.mean())
data.isnull().values.sum()
0
 

Затем выполняется оставшийся код,

 alpha = 0.01
iters = 1000
g,cost = gradientDescent(X,y,theta,iters,alpha)
print(g)
[[ 3.37617073e-16 -1.03407822e-01 -7.06228959e-02  3.63774873e-01
   2.51480688e-03  4.51868433e-01 -2.02133329e-01 -2.67955488e-01]]
finalCost = computeCost(X,y,g)
print(finalCost)
0.21914950571622366
 

График:

 fig, ax = plt.subplots()  
ax.plot(np.arange(iters), cost, 'r')  
ax.set_xlabel('Iterations')  
ax.set_ylabel('Cost')  
ax.set_title('Error vs. Training Epoch')
 

Текст (0.5, 1.0, 'Ошибка против Эпоха обучения')

Примечание: : Я не думаю, что вам следует использовать среднее значение всех данных, как показано ниже,

 data = (data - data.mean())/data.std()
 

Целевая переменная selling_price должна быть исключена из масштабирования.

Комментарии:

1. большое вам спасибо, я понял, что это позаботится об этом в следующий раз

2. Рад, что смог помочь.. Если это разрешено, пожалуйста, не забудьте принять ответ