020520201513
Work on diagnostic systems.
There is no progress in tank construction without diagnostics.
https://archive.ics.uci.edu/ml/datasets/Bike+Sharing+Dataset
import torch
I’m starting a GPU graphics card (which I don’t have)
Odpalam karte graficzną GPU (której nie mam)
device = torch.device('cpu') # obliczenia robie na CPU
#device = torch.device('cuda') # obliczenia robie na GPU
Output variables (3):¶
- SLUMP (cm)
- FLOW (cm)
- 28-day Compressive Strength (Mpa)
import pandas as pd
df = pd.read_csv('/home/wojciech/Pulpit/3/BikeSharing.csv')
print(df.shape)
df.head(3)
cnt: count of total rental bikes including both casual and registered
I fill all holes with values out of range
Wypełniam wszystkie dziury wartościami z poza zakresu
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(10,6))
CORREL =df.corr()
sns.heatmap(CORREL, annot=True, cbar=False, cmap="coolwarm")
plt.title('Macierz korelacji ze zmienną wynikową y', fontsize=20)
import matplotlib.pyplot as plt
plt.figure(figsize=(10,6))
CORREL['cnt'].plot(kind='barh', color='red')
plt.title('Korelacja ze zmienną wynikową', fontsize=20)
plt.xlabel('Poziom korelacji')
plt.ylabel('Zmienne nezależne ciągłe')
Zmienne: ‘registered’,’casual’ są to też wyniki tylko inazej pokazane dlatego trzeba je usunąć z danych
a,b = df.shape #<- ile mamy kolumn
b
print('NUMBER OF EMPTY RECORDS vs. FULL RECORDS')
print('----------------------------------------')
for i in range(1,b):
i = df.columns[i]
r = df[i].isnull().sum()
h = df[i].count()
pr = (r/h)*100
if r > 0:
print(i,"--------",r,"--------",h,"--------",pr)
import seaborn as sns
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')
#del df['Unnamed: 15']
#del df['Unnamed: 16']
df = df.dropna(how='any') # jednak je kasuje te dziury
# df.fillna(-777, inplace=True)
df.isnull().sum()
print(df.dtypes)
df.head(3)
to_datetime¶
df['dteday'] = pd.to_datetime(df['dteday'])
df['weekday'] = df.dteday.dt.weekday
df['month'] =df.dteday.dt.month
df['weekofyear'] =df.dteday.dt.weekofyear
del df['dteday']
print(df.dtypes)
df.head(3)
Encodes text values¶
Koduje wartości tekstowe
import numpy as np
a,b = df.shape #<- ile mamy kolumn
b
print('DISCRETE FUNCTIONS CODED')
print('------------------------')
for i in range(1,b):
i = df.columns[i]
f = df[i].dtypes
if f == np.object:
print(i,"---",f)
if f == np.object:
df[i] = pd.Categorical(df[i]).codes
continue
df[‘Time’] = pd.Categorical(df[‘Time’]).codes
df[‘Time’] = df[‘Time’].astype(int)
df.dtypes
df.columns
I specify what is X and what is y¶
Określam co jest X a co y
X = df.drop(['cnt','registered','casual'],1)
y = df['cnt']
Scaling (normalization) of the X value¶
X should never be too big. Ideally, it should be in the range [-1, 1]. If this is not the case, normalize the input.
Skalowanie (normalizacja) wartości X
X nigdy nie powinien być zbyt duży. Idealnie powinien być w zakresie [-1, 1]. Jeśli tak nie jest, należy znormalizować dane wejściowe.
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X = sc.fit_transform(X)
print(np.round(X.std(), decimals=2), np.round(X.mean(), decimals=2))
y.value_counts()
y = (y / 100) # max test score is 100
#print(y.head(3))
print(np.round(y.std(), decimals=2), np.round(y.mean(), decimals=2))
Creates random input and output¶
Tworzy losowe dane wejściowe i wyjściowe
import numpy as np
#X = X.values #- jak była normalizacja to to nie działa
X = torch.tensor(X)
print(X[:3])
X = X.type(torch.FloatTensor)
print(X[:3])
y = y.values # tworzymy macierz numpy - jak była normalizacja to to nie działa
y = torch.tensor(y)
print(y[:3])
y = y.view(y.shape[0],1)
y[:5]
y = y.type(torch.FloatTensor)
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
y = sc.fit_transform(y)
print(np.round(y.std(), decimals=2), np.round(y.mean(), decimals=2))
print('X:',X.shape)
print('y:',y.shape)
Dodanie jednego wymiaru do wektora wynikowego
y = y.view(y.shape[0],1)
y.shape
Podział na zbiór testowy i zbiór treningowy¶
a,b = X.shape
a
total_records = a
test_records = int(a * .2)
X_train = X[:total_records-test_records]
X_test = X[total_records-test_records:total_records]
y_train = y[:total_records-test_records]
y_test = y[total_records-test_records:total_records]
print('X_train: ',X_train.shape)
print('X_test: ',X_test.shape)
print('----------------------------------------------------')
print('y_train: ',y_train.shape)
print('y_test: ',y_test.shape)
y_train
Model¶
N, D_in = X_train.shape
N, D_out = y_train.shape
H = 10
device = torch.device('cpu')
model = torch.nn.Sequential(
torch.nn.Linear(D_in, H),
torch.nn.ReLU(),
torch.nn.ReLU(),
torch.nn.Linear(H, D_out),
).to(device)
MSE loss function¶
Funkcja straty MSE
loss_fn = torch.nn.MSELoss(reduction='sum')
Define of learning¶
Definiowanie nauki
y_pred = model(X_train)
y_pred[:5]
learning_rate = 0.00001
epochs = 3000
aggregated_losses = []
for t in range(epochs):
y_pred = model(X_train)
loss = loss_fn(y_pred, y_train) # <=# Obliczenie i wydruku straty. Mijamy Tensory zawierające przewidywane i prawdziwe
if t print(t, loss.item()) # <=# wartości y, a funkcja straty zwraca Tensor zawierający stratę.
aggregated_losses.append(loss) ## potrzebne do wykresu
model.zero_grad() #<= # Zeruj gradienty przed uruchomieniem przejścia do tyłu.
loss.backward() #<== Przełożenie wsteczne: oblicz gradient gradientu w odniesieniu do wszystkich możliwych do nauczenia się
# parametrów modelu. Wewnętrznie parametry każdego modułu są przechowywane
# w Tensorach z requires_grad=True, więc to wywołanie obliczy gradienty
# wszystkich możliwych do nauczenia parametrów w modelu.
with torch.no_grad(): #<== Zaktualizuj ciężary za pomocą opadania gradientu. Każdy parametr jest tensorem, więc
for param in model.parameters(): # możemy uzyskać dostęp do jego danych i gradientów tak jak wcześniej.
param.data -= learning_rate * param.grad
There are many potential reasons. Most likely exploding gradients. The two things to try first:¶
- Normalize the inputs
- Lower the learning rate
Istnieje wiele potencjalnych przyczyn. Najprawdopodobniej wybuchające gradienty. Dwie rzeczy do wypróbowania w pierwszej kolejności:
- – Normalizuj wejścia
- – Obniż tempo uczenia msię
import matplotlib.pyplot as plt
plt.plot(range(epochs), aggregated_losses)
plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show
Forecast based on the model¶
- substitute the same equations that were in the model
- The following loss result shows the last model sequence
- Loss shows how much the model is wrong (loss = sum of error squares) after the last learning sequence
Prognoza na podstawie modelu
- podstawiamy te same równania, które były w modelu
- Poniższy wynik loss pokazuje ostatnią sekwencje modelu
- Loss pokazuuje ile myli się model (loss = suma kwadratu błedów) po ostatniej sekwencji uczenia się
with torch.no_grad():
y_pred = model(X_test)
loss = (y_pred - y_test).pow(2).sum()
print(f'Loss train_set: {loss:.8f}')
Ponieważ ustaliliśmy, że nasza warstwa wyjściowa będzie zawierać 1 neuron, każda prognoza będzie zawierać 1 wartości. Przykładowo pierwsze 5 przewidywanych wartości wygląda następująco:
y_pred[:5]
We save the whole model¶
Zapisujemy cały model
torch.save(model,'/home/wojciech/Pulpit/7/byk15.pb')
We play the whole model¶
Odtwarzamy cały model
KOT = torch.load('/home/wojciech/Pulpit/7/byk15.pb')
KOT.eval()
By substituting other independent variables, you can get a vector of output variables¶
We choose a random record from the tensor
Podstawiając inne zmienne niezależne można uzyskać wektor zmiennych wyjściowych
Wybieramy sobie jakąś losowy rekord z tensora
y_pred = y_pred*10
foka = y_pred.cpu().detach().numpy()
df11 = pd.DataFrame(foka)
df11.columns = ['y_pred']
df11=np.round(df11.y_pred)
df11.head(3)
y_test = y_test*10
foka = y_test.cpu().detach().numpy()
df_t = pd.DataFrame(foka)
df_t.columns = ['y']
df_t.head(3)
NOWA = pd.merge(df_t,df11, how='inner', left_index=True, right_index=True)
NOWA.head(3)
NOWA.to_csv('/home/wojciech/Pulpit/7/NOWA.csv')
fig, ax = plt.subplots( figsize=(16, 2))
for ewa in ['y', 'y_pred']:
ax.plot(NOWA, label=ewa)
ax.set_xlim(1340, 1500)
#ax.legend()
ax.set_ylabel('Parameter')
ax.set_title('COURSE OF THE PROJECTING PROCESS ON THE TEST SET')
## marginesy
plt.subplots_adjust( left = None , bottom = None , right = None , top = None , wspace = None , hspace = None )
plt.figure(figsize=(16,5))
ax = plt.subplot(1, 2, 1)
NOWA.plot.kde(ax=ax, legend=True, title='Histogram: y vs. y_pred')
NOWA.plot.hist(density=True,bins=40, ax=ax, alpha=0.3)
ax.set_title("Dystributions")
ax = plt.subplot(1, 2, 2)
sns.boxplot(data = NOWA)
plt.xticks(rotation=-90)
ax.set_title("Boxes")
sns.lmplot(data=NOWA, x='y', y='y_pred')
Regression_Assessment¶
## Robi ocenę tylko dla jednej zmiennej
def Regression_Assessment(y, y_pred):
from sklearn.metrics import r2_score
import scipy.stats as stats
from statsmodels.graphics.gofplots import qqplot
from matplotlib import pyplot
print('-----two methods--------------')
SS_Residual = sum((y-y_pred)**2)
SS_Total = sum((y-np.mean(y))**2)
r_squared = 1 - (float(SS_Residual))/SS_Total
adjusted_r_squared = 1 - (1-r_squared)*(len(y)-1)/(len(y)-X.shape[1]-1)
print('r2_score: #print('adjusted_r_squared:
#print('----r2_score------secound-method--------')
print('r2_score: print()
print('-------------------------------')
MAE = (abs(y-y_pred)).mean()
print('Mean absolute error MAE: RMSE = np.sqrt(((y-y_pred)**2).mean())
print('Root mean squared error RMSE: pt = (100*(y-y_pred))/y
MAPE = (abs(pt)).mean()
print('Mean absolute error MAPE: print('-------------------------------')
stat,pvalue0 = stats.ttest_1samp(a=(y-y_pred),popmean=0.0)
if pvalue0 > 0.01:
print('t-test H0:suma reszt modelu wynosi zero--')
print('OK! Resztki modelu nie różnią się od zera - pvalue: else:
print('Źle - Resztki modelu RÓŻNIĄ SIĘ OD ZERA - pvalue: print('--------------------------------------------------------------------------------------------')
stat,pvalue2_1 = stats.shapiro(y)
stat,pvalue2_2 = stats.shapiro(y_pred)
if pvalue2_1 > 0.01:
#print('Shapiro-Wilk H0: y maj rozkład normalny?--------------------------------')
print('OK Shapiro-Wilk! y maja rozkład normalny - pvalue: else:
print('Źle Shapiro-Wilk - y NIE MA ROZKŁADU NORMALNEGO - pvalue: print('--------------------------------------------------------------------------------------------')
if pvalue2_2 > 0.01:
#print('Shapiro-Wilk: y_pred maj rozkład normalny?--')
print('OK Shapiro-Wilk! y_pred ma rozkład normalny - pvalue: else:
print('Źle Shapiro-Wilk y_pred NIE MA ROZKŁADU NORMALNEGO - pvalue: qqplot(y, line='s')
pyplot.show()
qqplot(y_pred, line='s')
pyplot.show()
print('--------------------------------------------------------------------------------------------')
stat,pvalue3 = stats.kruskal(y_pred,y)
stat,pvalue4 = stats.f_oneway(y_pred,y)
if pvalue2_1 < 0.01 or pvalue2_2 < 0.01:
print('Shapiro-Wilk: Zmienne nie mają rozkładu normalnego! Nie można zrobić analizy ANOVA')
if pvalue3 > 0.01:
print('Kruskal-Wallis NON-PARAMETRIC TEST: czy prognoza i obserwacje empir. mają równe średnie?')
print('OK! Kruskal-Wallis H0: prognoza i obserwacje empir. mają równe średnie - pvalue: else:
print('Źle - Kruskal-Wallis: prognoza i obserwacje empir. NIE MAJĄ równych średnich - pvalue: else:
if pvalue4 > 0.01:
print('F-test (ANOVA): czy prognoza i obserwacje empir. mają równe średnie?--------------------------------')
print('OK! prognoza i obserwacje empir. mają równe średnie - pvalue: else:
print('Źle - prognoza i obserwacje empir. NIE MAJĄ równych średnich - pvalue: print('--------------------------------------------------------------------------------------------')