Lineáris regresszióval

Használati eset: Van összefüggés a páratartalom és a hőmérséklet között? Mi a helyzet a páratartalom és a látszólagos hőmérséklet között? Meg tudja jósolni a látszólagos hőmérsékletet a páratartalom alapján?

Adatkészlet: Adatkészlet megtekintése

A gyakorláshoz letöltheti az adatkészletet a fenti linkről.

Először importálnunk kell néhány könyvtárat. Mivel a legtöbb python-könyvtár rendelkezik hasznos funkciókkal, amelyek egyszerűen kiküszöbölik a kódok írásának szükségességét a semmiből. Tehát az alábbi könyvtárakat importáltam.

import numpy as np
import pandas as pd
import scipy.stats as stats 
from matplotlib import pyplot as plt
%matplotlib inline
                   
from sklearn.preprocessing import StandardScaler

A Pandákat elsősorban adatelemzésre használják különféle fájlformátumokkal, például vesszővel elválasztott értékek, JSON, SQL, Microsoft Excel. Ezen túlmenően néhány adatkezelési műveletet is végrehajthat, mint például egyesítés, átformálás, kijelölés, tisztítás stb. További könyvtárakról, ahol szükséges, elmagyarázom.

Az alábbiakban kódokat adtam hozzá a Google Drive-fióknak a google Colaboratoryhoz való csatlakoztatásához, hogy hozzáférjen a meghajtón elérhető fájlokhoz. Amikor végrehajtjuk az alábbi kódot, a generált URL-re kell lépnünk, és be kell kérnünk az engedélyezési kódot az ide való belépéshez.

from google.colab import drive
drive.mount("/content/gdrive")

Az engedélyezési kód beírása után. egy üzenetet fog kapni: „Megerősítve: /content/drive. Ezután az alábbi kóddal elérheti a csatlakoztatott Google meghajtón elérhető fájlokat.

data = pd.read_csv('/content/gdrive/My Drive/Colab Notebooks/data/weatherHistory.csv')

Most sikeresen betöltötte adatait a „data” nevű változóba. módosítás céljából átmásoltam ezeket az adatokat egy másik „X” nevű változóba

X = data.copy() #dataset has been copied to  X

Az alábbi kód követésével megtekintheti az adott változó 10 leggyakrabban tárolt adatsorát. A Pandas könyvtár a head() nevű metódust széles körben alkalmazza egy adatkeret vagy sorozat felső n sorának visszaadására. ez a módszer alapértelmezés szerint a tárolt adatkészlet felső 5 sorát adja vissza.

X.head(10)

01. lépés Adatok előfeldolgozása

Az adatok előfeldolgozása a Machine Learning egyik fő lépése, mivel az adathalmazból származtatható hasznos információk közvetlenül befolyásolják a modell minőségét, ezért rendkívül fontos, hogy legalább a szükséges előfeldolgozást elvégezzük az adatokkal, mielőtt betápláljuk azokat a modellünkbe.

01 A lépés -› Adattisztítás - A hiányzó értékek azonosítása és kezelése, ismétlődő rekordok

Az alábbi kódok követésével azonosítani tudjuk a hiányzó értékeket az egyes oszlopokban lévő adatokban

X.isnull().any()

A fenti kimenetben láthatjuk, hogy a Precip Type True. az egyensúly hamis. Tehát arra a következtetésre juthatunk, hogy a Precip Type-nek vannak hiányzó értékei, és az egyensúlyi jellemzőknél nincsenek hiányzó értékek. Tehát kezelnünk kell a hiányzó értékeket. Ehhez ellenőriznünk kell a hiányzó értékek százalékos arányát az adott értékekben.

X['Precip Type'].value_counts() # To get the count of each available types

(X['Precip Type'].isnull().sum()/len(X.index) )*100 # To check the null values percentage in available data set

A fenti kibocsátási százalékos értékekből azt mondhatjuk, hogy a null értékek százalékos aránya a rendelkezésre álló adatokhoz képest jóval kisebb. Így eldobhatjuk ezeket a nullértéksorokat, és egyenlegadatokat kaphatunk a további előfeldolgozási tevékenységekhez. Az alábbi kód követésével eldobhatjuk a null értékeket

X = X.dropna() #drop all nan values in given data set
X.isnull().sum() # For the verification.

A fenti kimenetben mindegyik nulla érték, így most arra a következtetésre juthatunk, hogy nincs nan értékünk az adatkészletben.

Az alábbi kódok követésével ellenőrizhetjük, hogy az adatkészletben van-e ismétlődő sor. A kimenet alatt látható, hogy igaz 24 értéknél, hamis pedig 95912 értéknél. Tehát arra a következtetésre juthatunk, hogy ennek az adathalmaznak 24 duplikált értéke van.

print(X.duplicated().value_counts()) # To check duplicated values

print(X[X.duplicated()]) # To check view the duplicated values

X=X.drop_duplicates() # To drop the duplicate values
print(X.duplicated().value_counts()) # To check duplicated values

A fenti kimenetből arra a következtetésre juthatunk, hogy az adathalmazban nem voltak duplikált sorok

01. lépés B -› Adattisztítás – A kiugró értékek azonosítása és kezelése

Kiugró értéknek olyan objektumot nevezünk, amely jelentősen eltér a többi objektumtól. Különböző típusú hibák okozhatják. Tehát el kell végeznünk a kiugró értékek elemzését az adott adathalmazban, hogy jó minőségű modellt kapjunk.

Az alábbi kód követésével megkaphatjuk a folyamatos oszlopneveket,

plt.rcParams["figure.figsize"] = (22, 3)
X._get_numeric_data().columns.tolist()

A fenti kód kimenete: ['Hőmérséklet ©", "Látható hőmérséklet ©", "Nedvesség", "Szélsebesség (km/h)", "Szélcsapágy (fok)", "Láthatóság (km)", "Hangos burkolat" ,'Nyomás (milibar)], így elemzést végezhetünk ezeken az oszlopokon.

Box plot és Q-Q Plot of Temperature © oszlop

Az alábbi kódot követve elkészíthetjük az adott oszlopok boxplotját, hogy ellenőrizzük a kiugró értékeket,

temp_df = pd.DataFrame(X, columns=['Temperature (C)'])
temp_df.boxplot(vert=False)

Az alábbi kódot követve ábrázolhatjuk a valószínűségi diagramot adott oszlopokban, hogy ellenőrizzük az eloszlási mintákat, az értéktartományt stb.,

plt.rcParams["figure.figsize"] = (10, 6)
stats.probplot(X["Temperature (C)"], dist="norm", plot=plt)
plt.show()

Box plot és Q-Q diagram a látszólagos hőmérsékletről © oszlop

Az alábbi kódot követve elkészíthetjük az adott oszlopok boxplotját, hogy ellenőrizzük a kiugró értékeket,

plt.rcParams["figure.figsize"] = (22, 3)
temp_df = pd.DataFrame(X, columns=['Apparent Temperature (C)'])
temp_df.boxplot(vert=False)

Az alábbi kódot követve ábrázolhatjuk a valószínűségi diagramot adott oszlopokban, hogy ellenőrizzük az eloszlási mintákat, az értéktartományt stb.,

plt.rcParams["figure.figsize"] = (10, 6)
stats.probplot(X['Apparent Temperature (C)'], dist="norm", plot=plt)
plt.show()

Box diagram és Q-Q Plot of Wind Speed ​​(km/h) oszlop

Az alábbi kódot követve elkészíthetjük az adott oszlopok boxplotját, hogy ellenőrizzük a kiugró értékeket,

plt.rcParams["figure.figsize"] = (22, 3)
temp_df = pd.DataFrame(X, columns=['Wind Speed (km/h)'])
temp_df.boxplot(vert=False)

Az alábbi kódot követve ábrázolhatjuk a valószínűségi diagramot adott oszlopokban, hogy ellenőrizzük az eloszlási mintákat, az értéktartományt stb.,

plt.rcParams["figure.figsize"] = (10, 6)
stats.probplot(X['Wind Speed (km/h)'], dist="norm", plot=plt)
plt.show()

Box diagram és Q-Q Plot of Wind Bearing (fok) oszlop

Az alábbi kódot követve elkészíthetjük az adott oszlopok boxplotját, hogy ellenőrizzük a kiugró értékeket,

plt.rcParams["figure.figsize"] = (22, 3)
temp_df = pd.DataFrame(X, columns=['Wind Bearing (degrees)'])
temp_df.boxplot(vert=False)

Az alábbi kódot követve ábrázolhatjuk a valószínűségi diagramot adott oszlopokban, hogy ellenőrizzük az eloszlási mintákat, az értéktartományt stb.,

plt.rcParams["figure.figsize"] = (10, 6)
stats.probplot(X['Wind Bearing (degrees)'], dist="norm", plot=plt)
plt.show()

Dobozábra és Q-Q láthatósági diagram (km) oszlop

Az alábbi kódot követve elkészíthetjük az adott oszlopok boxplotját, hogy ellenőrizzük a kiugró értékeket,

plt.rcParams["figure.figsize"] = (22, 3)
temp_df = pd.DataFrame(X, columns=['Visibility (km)'])
temp_df.boxplot(vert=False)

Az alábbi kódot követve ábrázolhatjuk a valószínűségi diagramot adott oszlopokban, hogy ellenőrizzük az eloszlási mintákat, az értéktartományt stb.,

plt.rcParams["figure.figsize"] = (10, 6)
stats.probplot(X['Visibility (km)'], dist="norm", plot=plt)
plt.show()

Box plot és Q-Q Plot of Loud Cover oszlop

Az alábbi kódot követve elkészíthetjük az adott oszlopok boxplotját, hogy ellenőrizzük a kiugró értékeket,

plt.rcParams["figure.figsize"] = (22, 3)
temp_df = pd.DataFrame(X, columns=['Loud Cover'])
temp_df.boxplot(vert=False)

Az alábbi kódot követve ábrázolhatjuk a valószínűségi diagramot adott oszlopokban, hogy ellenőrizzük az eloszlási mintákat, az értéktartományt stb.,

plt.rcParams["figure.figsize"] = (10, 6)
stats.probplot(X['Loud Cover'], dist="norm", plot=plt)
plt.show()

A „Loud Cover” értékét a következő megjegyzéssel tekinthetjük meg,

X['Loud Cover'].value_counts()

A kimenet 0,0 95912

A fenti értékekből és a „Hangos borító” dobozábrázolásából arra a következtetésre juthatunk, hogy nem érdemes ezt az oszlopot megtartani. Mert minden érték azonos és nulla. Tehát az alábbi kódok követésével törölhetjük ezt az oszlopot az adatkészletünkből,

X = X.drop('Loud Cover', axis = 1)

Box plot és Q-Q Plot of Pressure (milibar) oszlop

Az alábbi kódot követve elkészíthetjük az adott oszlopok boxplotját, hogy ellenőrizzük a kiugró értékeket,

plt.rcParams["figure.figsize"] = (22, 3)
temp_df = pd.DataFrame(X, columns=['Pressure (millibars)'])
temp_df.boxplot(vert=False)

Az alábbi kódot követve ábrázolhatjuk a valószínűségi diagramot adott oszlopokban, hogy ellenőrizzük az eloszlási mintákat, az értéktartományt stb.,

plt.rcParams["figure.figsize"] = (10, 6)
stats.probplot(X['Pressure (millibars)'], dist="norm", plot=plt)
plt.show()

Felülről Box plot és Alul counts láthatunk néhány anomáliát.

X['Pressure (millibars)'].value_counts()

Az alábbi kód követésével megkaphatjuk az adott oszlop leírásait, például átlag, szám, std, min stb.

X['Pressure (millibars)'].describe()

Az alábbi kód követésével ábrázolhatjuk a pontokat a grafikonon, hogy ellenőrizzük az értékváltozások mintáját,

plt.rcParams["figure.figsize"] = (500, 8)
plt.plot(X['Pressure (millibars)'].tolist(), label="Pressure")
plt.show()

A fenti grafikonon látható, hogy jelentős mennyiségű nyomásesés van, ami egyenlő nullával. Ez a mérőgép hibái miatt következhet be. A széles körben elfogadott határvonalat, ahol a tér kezdődik, amely egyben az a pont, ahol a légnyomást nullának kell tekinteni, Kármán-vonalnak nevezik, amely 100 km-rel feljebb található. így nincs lehetőség arra, hogy nulla vagy nullánál kisebb érték legyen abban az oszlopban.

Az alábbi kódot követve kiszámíthatjuk, hogy az adott oszlopban hány százalékos nulla vagy nullánál kisebb érték van.

len(X[(X['Pressure (millibars)']<=0.0) ])* 100/len(X)

1.342897656184836

Az alábbi kódok követésével visszaállíthatjuk az adatkeretek indexét, hogy elkerüljük a problémákat a jövőben.

X=X.reset_index(drop=True)

Az alábbi kód követésével hozzárendelhetjük az np.nan-t a nulla értékekhez a nyomásoszlopban, hogy megfelelő értékeket rendeljünk hozzá,

X.loc[X.index[X['Pressure (millibars)']<=0.0].tolist(), ['Pressure (millibars)']] =np.nan

A következő kóddal ellenőrizhetjük, hogy helyesen adtuk-e meg az értékeket,

X['Pressure (millibars)'].isnull().sum() # Verification

A kimenet 1288 .

Az alábbi kód követésével megfelelő értéket rendelhetünk az np.nan értékekhez a nyomásoszlopban,

from sklearn.impute import SimpleImputer
imputer = SimpleImputer()
imputer.fit(X[['Pressure (millibars)']])
X['Pressure (millibars)']=imputer.fit_transform(X[['Pressure (millibars)']])

A következő kóddal ellenőrizhetjük, hogy a SimpleImputer helyesen adta-e meg az értékeket:

X['Pressure (millibars)'].isnull().sum() # Verificaion

0

A Simple Imputer használata után Vizualizáció grafikonon,

plt.plot(X['Pressure (millibars)'].tolist(), label="Pressure")
plt.show()

Valószínűségi diagram a Simple Imputer használata után,

plt.rcParams["figure.figsize"] = (10, 6)
stats.probplot(X['Pressure (millibars)'], dist="norm", plot=plt)
plt.show()

Box plot és Q-Q Plot of Humidity oszlop

Az alábbi kódot követve elkészíthetjük az adott oszlopok boxplotját, hogy ellenőrizzük a kiugró értékeket,

plt.rcParams["figure.figsize"] = (22, 3)
temp_df = pd.DataFrame(X, columns=['Humidity'])
temp_df.boxplot(vert=False)

Az alábbi kódot követve ábrázolhatjuk a valószínűségi diagramot adott oszlopokban, hogy ellenőrizzük az eloszlási mintákat, az értéktartományt stb.,

plt.rcParams["figure.figsize"] = (10, 6)
stats.probplot(X['Humidity'], dist="norm", plot=plt)
plt.show()

a

A fenti diagramból láthatjuk, hogy egyes értékek 0-val rendelkeznek. De gyakorlatilag nem lehetséges, hogy normál környezetben nulla vagy ennél kisebb érték legyen.

plt.rcParams["figure.figsize"] = (500, 8)
plt.plot(X['Humidity'].tolist(), label="Humidity")
plt.show()

A fenti kód használatával megrajzolhatjuk a grafikont, hogy lássuk az értékek változási mintáját.

A következő kóddal ellenőrizhetjük a nulla értékek százalékos arányát az adatkészlethez képest.

len(X[(X['Humidity']<=0.0) ])* 100/len(X)

0.022937692885144717

Az alábbi kód követésével megkaphatjuk az adott oszlop leírásait, például átlag, szám, std, min stb.

X['Humidity'].describe()

A fenti bizonyítékok alapján elmondhatjuk, hogy a páratartalomnak nagyon kevés a kiugró értéke. Tehát az alábbi kód követésével ezeket az értéksorokat eldobhatjuk adatkészletünkben.

X.drop(X[X['Humidity'] == 0].index, inplace = True)

Ha minden egyes sorérték-ledobás után visszaállítottuk az indexet a kód követésével, elkerülhetjük a hibákat a jövőben az oszlopok összekapcsolásakor vagy adathalmazok felosztása során.

X=X.reset_index(drop=True)

01. lépés C -› Adatkódolás

Az ML modellekhez minden bemeneti és kimeneti értéknek numerikusnak kell lennie. Tehát ha az adatkészlet kategorikus adatokat tartalmaz, akkor ezeket számokba kell kódolnia, mielőtt illeszkedne és értékelné a modellt. A feladat elvégzésére számos módszer áll rendelkezésre, mint például a One-hot Encoding, az Integer (címke) kódolás. Itt egész szám (címke) kódolást használtam, mert a One-hot Encoding nem kezeli automatikusan az új kategóriákat a tesztkészletben.

Az alábbi kódok használatával kategorizálhatjuk a „csapadék típusát”, „összefoglalóját”.

from sklearn.preprocessing import LabelEncoder
labelencoder =LabelEncoder()

X['Precip_Types_cat']=labelencoder.fit_transform(X['Precip Type']) 
X = X.drop('Precip Type', axis = 1) 
X['Summary_cat']=labelencoder.fit_transform(X['Summary'])
X = X.drop('Summary', axis = 1)

Az adatok kódolása után eldobtam az eredeti oszlopokat. ez a kód a fenti kódrészleten is elérhető.

01. lépés C -› Jellemzők diszkretizálása

A jellemzők diszkretizálása a jellemzők vagy változók folytonos értékeinek diszkretizált vagy névleges jellemzőkké vagy intervallumokká történő felosztására vagy konvertálására utal. Itt a sklearn.preprocessing KBinsDiscretizer-jét használtam a megfelelő feladat elvégzésére.

Az alábbi kódot követheti a „szélcsapágy (fok)” jellemző diszkretizálásához, mivel a „szélcsapágy (fok)” értéke 0 és 359 fok között van.

Általában a szélirányokat a szélirány alapján veszik figyelembe a fenti kép szerint. így az n_bins = 16 értéket választottam a további munkához

from sklearn.preprocessing import KBinsDiscretizer
discretizer = KBinsDiscretizer(n_bins=16, encode='ordinal', strategy='uniform') 
discretizer.fit(X[['Wind Bearing (degrees)']])
X['Wind Bearing (degrees)'] = discretizer.transform(X[['Wind Bearing (degrees)']])

Itt megcsináltam egy funkciókódolást a tartályokhoz,

X['Wind_Bearing_cat']=labelencoder.fit_transform(X['Wind Bearing (degrees)'])
X = X.drop('Wind Bearing (degrees)', axis = 1)
X.head() # For the verification

A jellemzők diszkretizálásának hatását az alábbi kép utolsó oszlopában láthatja.

a következő kóddal ellenőrizheti a null értékeket a munka folytatásához.

X.isnull().any()

01 D lépés -› Adatszivárgás kezelése

Az adatszivárgás kezelésére az átalakítások elvégzése előtt szétválaszthatjuk a vonatkészlet adatait és a tesztkészlet adatait. Csak a betanítási adatokon kell kiszámítanunk az átlagot és a szórást a normalizáláshoz vagy más, a statisztikákhoz kapcsolódó transzformációkhoz, és ezekkel az értékekkel transzformáljuk magát a betanítási adatokat, majd ugyanezeket az értékeket a tesztadatok átalakításához. A tesztadatkészletnek a transzformációs számításba való bevonása lehetővé teszi, hogy a tesztadatokból információ áramoljon a vonatadatokhoz, és ezáltal a modellhez, amely tanul azokból, így lehetővé válik a modell csalása (elfogultság bevezetése).

A fenti kód követésével két részre oszthatjuk az adathalmazt. test_size=0.2, így az adatsorok 20%-át tesztelési céllal, 80%-át pedig betanítási céllal kaphatjuk meg random_state=42-vel. A Random_state lehet 0 vagy 1, vagy bármely más egész szám. de ugyanannak az értéknek kell lennie, ha a kódokat vagy a fájlt a kód többszöri végrehajtásával kell érvényesítenie újra és újra.

from sklearn.model_selection import train_test_split
train_X, test_X = train_test_split(X, test_size=0.2,random_state=42)

Ha minden egyes sorérték-ledobás után visszaállítottuk az indexet a kód követésével, akkor elkerülhetjük a hibákat a jövőben az oszlopok összekapcsolásakor vagy adathalmazok felosztása során.

train_X=train_X.reset_index(drop=True) # Reset the dataframe Index
len(train_X) # look the length for verification

76712, Ez a vonat_X hossza

test_X.head() # look  for verification

02. lépés Adatátalakítások

Leginkább azt részesítjük előnyben, ha az adatok normál elosztásból származnak a modell betanításához. Mivel a valós adatkészletek jellemzői általában inkább torz eloszlást követnek. Ezeknek a változóknak a ferdeségétől függően különböző típusú transzformációk alkalmazásával a ferde eloszlást leképezhetjük a normál eloszlásba.

Az alábbi kód követésével hisztogramot generálhatunk adatkészletünk folytonos értékoszlopaihoz. ebből a hisztogramból láthatjuk az adatok eloszlását a jellemzőben.

plt.rcParams["figure.figsize"] = (24, 12)
train_X[['Temperature (C)','Apparent Temperature (C)','Humidity','Wind Speed (km/h)','Visibility (km)','Pressure (millibars)']].hist()

A fenti kód kimenetét az alábbi képen láthatja,

A páratartalom adatátalakítása

Az alábbi kód követésével egyetlen hisztogramot hozhatunk létre az adatoszlophoz,

plt.rcParams["figure.figsize"] = (24, 6)
train_X['Humidity'].hist()

A páratartalom hisztogramjából a balra ferde eloszlásokat láthatjuk. Így exponenciális vagy hatványtranszformációt használhatunk a balra ferde eloszlások csökkentésére

from sklearn.preprocessing import FunctionTransformer
exponential_transformer = FunctionTransformer(np.exp, validate=True)
exponential_transformer.fit(train_X[['Humidity']])
train_X['Humidity'] = exponential_transformer.transform(train_X[['Humidity']]) 
test_X['Humidity'] = exponential_transformer.transform(test_X[['Humidity']])

A fenti transzformációs kódból csak a train_X[[’Humidity’]]-t kell illesztenünk, hogy elkerüljük az adatszivárgást.

Az alábbi kóddal megnézhetjük a hisztogramot az exponenciális transzformáció után,

train_X['Humidity'].hist()

A szélsebesség adatátalakítása (km/h)

Az alábbi kód követésével egyetlen hisztogramot hozhatunk létre az adatoszlophoz,

train_X['Wind Speed (km/h)'].hist()

A szélsebesség hisztogramja (km/h) felülről láthatjuk a jobbra ferde eloszlásokat. Így használhatjuk a négyzetgyök transzformációt a jobbra ferde eloszlások csökkentésére

Square_root_transformer = FunctionTransformer(np.sqrt,validate=True)
Square_root_transformer.fit(train_X[['Wind Speed (km/h)']])
train_X['Wind Speed (km/h)'] = Square_root_transformer.transform(train_X[['Wind Speed (km/h)']]) 
test_X['Wind Speed (km/h)'] = Square_root_transformer.transform(test_X[['Wind Speed (km/h)']])

A fenti transzformációs kódból csak a train_X[[’Wind Speed ​​(km/h)’]]-t kell illesztenünk, hogy elkerüljük az adatszivárgást.

Az alábbi kóddal megnézhetjük a hisztogramot a négyzetgyök transzformáció után,

train_X['Wind Speed (km/h)'].hist()

Láthatósági adatok transzformációja (km)

Az alábbi kód követésével egyetlen hisztogramot hozhatunk létre az adatoszlophoz,

train_X['Visibility (km)'].hist()

Felülről a Láthatóság hisztogramja (km) láthatjuk a balra ferde eloszlásokat. Így exponenciális vagy hatványtranszformációt használhatunk a balra ferde eloszlások csökkentésére

exponential_transformer = FunctionTransformer(np.exp,validate=True)
exponential_transformer.fit(train_X[['Visibility (km)']])
train_X['Visibility (km)'] = exponential_transformer.transform(train_X[['Visibility (km)']]) 
test_X['Visibility (km)'] = exponential_transformer.transform(test_X[['Visibility (km)']])

A fenti transzformációs kódból csak a train_X[[’Láthatóság (km)]]-et kell illesztenünk, hogy elkerüljük az adatszivárgást.

Az alábbi kóddal megnézhetjük a hisztogramot az exponenciális transzformáció után,

train_X['Visibility (km)'].hist()

A kód követésével eldobhatjuk a „Napi összegzés” oszlopot,

train_X = train_X.drop('Daily Summary', axis = 1) 
test_X = test_X.drop('Daily Summary', axis = 1)# Dependent Feature so we can remove that

03. lépés Adatok szabványosítása

Az adatok szabványosítása egy vagy több jellemző átskálázásának módja, hogy azok átlagértéke 0 és szórása 1 legyen. A szabványosítás feltételezi, hogy az adatok Gauss (haranggörbe) eloszlásúak. de ennek nem feltétlenül kell igaznak lennie, de az a technika tekinthető hatékonyabbnak, ha a jellemzőértékek eloszlása ​​Gauss-hoz tartozik.

A szabványosítás előtt el kell távolítanunk a Kategorikus jellemzőket. Tehát az alábbi kódok követésével eltávolíthatja,

Remove_columns_values = ['Formatted Date','Precip_Types_cat','Summary_cat','Apparent Temperature (C)','Wind_Bearing_cat']
train_X_without_Cat=train_X.drop(Remove_columns_values, axis = 1)
test_X_without_Cat=test_X.drop(Remove_columns_values, axis = 1)
train_X_without_Cat.head(10) # For the verification

A kimenetet a kategorikus jellemzők eltávolítása után láthatjuk,

Az index ellenőrzéséhez a jövőbeni hibák elkerülése érdekében,

train_X.head()

Az alábbi kódokkal szabványosítást alkalmazhatunk a szabványos skálázó hívásával,

scaler = StandardScaler() 

train_X_Except =train_X_without_Cat
test_X_Except =test_X_without_Cat

scaler.fit(train_X_Except)

train_X_Scaled = scaler.transform(train_X_Except)
test_X_Scaled = scaler.transform(test_X_Except)

A fenti kódban csak a train_X_Exceptet kell illesztenünk a scaler.fit()-be, hogy elkerüljük az adatszivárgást

Az alábbi kódokkal a szabványosított adatokat illeszthetjük az adatkeretbe,

columns_value_new=train_X_without_Cat.columns

train_X_Scaled_Except = pd.DataFrame(train_X_Scaled, columns=columns_value_new)
train_X_Scaled_Except.head(10) # data set after Standardization

Kimenet az ellenőrzéshez,

Ugyanez vonatkozik a tesztadatkészletre is.

columns_value_new=test_X_without_Cat.columns

test_X_Scaled_Except = pd.DataFrame(test_X_Scaled, columns=columns_value_new)
test_X_Scaled_Except.head(10) # data set after Standardization

Kimenet az ellenőrzéshez,

Tekintse meg az adatkészletet a hisztogramban a méretezési/standardizáló hatás megjelenítéséhez,

plt.rcParams["figure.figsize"] = (24, 12)
train_X_Scaled_Except.hist()

04. lépés Korrelációs mátrix és főkomponens-elemzés (PCA)

A jelentős és független jellemzők azonosítása

Az alábbi kódok követésével előállíthatjuk a korrelációs mátrixot az adott adatkészlethez,

import seaborn as sns
plt.rcParams["figure.figsize"] = (24, 8)
sns.heatmap(train_X_Scaled_Except.corr(),annot=True); #Seems they can be assuemed as independent

Az alábbi képen látható a tulajdonságok korrelációját ábrázoló kimenet

A fenti korrelációs mátrixból arra a következtetésre juthatunk, hogy a páratartalom és a hőmérséklet magas korrelációt mutat más jellemzőkkel összehasonlítva, de nem túl magas. így megtarthatjuk ezt a funkciót a modell betanításához.

# By following those below and above , we can see the signifncance of the features compare to other features

train_X_Scaled_Except.corr()

A fenti táblázatból láthatjuk az egyes jellemzők közötti összefüggések értékeit.

Most ismét csatlakoznunk kell a látszólagos hőmérséklet © a fenti változóhoz, hogy megvizsgáljuk a látszólagos hőmérséklet és más jellemzők közötti összefüggést. Az alábbi kód követésével ezt megtehetjük,

train_X_Scaled_With_Y = train_X_Scaled_Except.join(train_X['Apparent Temperature (C)'])
train_X_Scaled_With_Y.isnull().sum()
# Check for the null values

test_X_Scaled_With_Y = test_X_Scaled_Except.join(test_X['Apparent Temperature (C)'])
test_X_Scaled_With_Y.isnull().sum()
# Check for the null values

Az alábbi kód követésével korrelációs mátrixot állíthatunk elő az összes jellemzőhöz,

sns.heatmap(train_X_Scaled_With_Y.corr(),annot=True); #Seems they can be assuemed as independent

A fenti korrelációs mátrixból és az alábbi táblázatból arra a következtetésre juthatunk, hogy a páratartalom és a hőmérséklet magas negatív korrelációt mutat más jellemzőkkel összehasonlítva. valamint a látszólagos hőmérséklet nagyon magas pozitív korrelációt mutat a hőmérséklettel, ugyanakkor negatív korrelációt a páratartalommal.

#test the signifncance of the features

train_X_Scaled_With_Y.corr()

A fenti kód követésével létrehozhatunk egy táblázatot, amely részletesen megvizsgálja a korrelációs értékeket,

A vonat adatkészlethez A kategorikus változókat vissza kell kapcsolnunk a PCA-hoz.

train_X_For_PCA =train_X_Scaled_Except.join(train_X['Precip_Types_cat'])
train_X_For_PCA = train_X_For_PCA.join(train_X['Summary_cat'])
train_X_For_PCA = train_X_For_PCA.join(train_X['Wind_Bearing_cat'])
#train_X_For_PCA.isnull().sum()

A teszt adatkészlethez A kategorikus változókat vissza kell kapcsolnunk a PCA-hoz.

test_X_For_PCA =test_X_Scaled_Except.join(test_X['Precip_Types_cat'])
test_X_For_PCA = test_X_For_PCA .join(test_X['Summary_cat'])
test_X_For_PCA = test_X_For_PCA .join(test_X['Wind_Bearing_cat'])
#test_X_For_PCA.isnull().sum()

Főkomponens-elemzés – (PCA)

A főkomponens-elemzés vagy PCA egy dimenziócsökkentő módszer, amelyet gyakran használnak nagy adathalmazok dimenziósságának csökkentésére oly módon, hogy a változók nagy halmazát egy kisebbre alakítják át, amely még mindig tartalmazza a nagy halmazban lévő információ nagy részét.

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

train_X_PCA_data =train_X_For_PCA
test_X_PCA_data =test_X_For_PCA

pca = PCA(n_components=7)
pca.fit(train_X_PCA_data)
train_X_pca = pca.fit_transform(train_X_PCA_data) 
test_X_pca = pca.fit_transform(test_X_PCA_data) 

train_X_principalDf = pd.DataFrame(data = train_X_pca)
test_X_principalDf = pd.DataFrame(data = test_X_pca)

train_X_principalDf.head(10)

A főkomponens-elemzés végrehajtása után vonja be az X értékek adatkészletét

Tesztelje az X értékeket a főkomponens-elemzés elvégzése után

test_X_principalDf.head(10)

A főkomponens-elemzés elvégzése után láthatjuk a vonat adatkészlet X értékek alakját,

print(train_X_principalDf.shape)

(76712, 7)

A következő kóddal megtekinthetjük a főkomponens-elemzés által magyarázott varianciaarány értékeket,

pca.explained_variance_ratio_

tömb([0,49043775, 0,40130885, 0,03932747, 0,02414914, 0,01985586,0,01804037, 0,00558572])

A pca.explained_variance_ratio_ paraméter az egyes dimenziók által magyarázott variancia vektorát adja vissza. itt a pca.explained_variance_ratio_[i] megadja az i+1. dimenzióval magyarázható szórást.

Az alábbi kód követésével létrehozhatja a kumulatív magyarázatos varianciagráfot,

plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.xlabel('number of components')
plt.ylabel('cumulative explained variance');

05. lépés Lineáris regresszió

A lineáris regresszió az egyik felügyelt gépi tanulási algoritmus, ahol az előre jelzett kimenet folyamatos és állandó meredekséggel rendelkezik. A folyamatos tartományon belüli értékek előrejelzésére szolgál, ahelyett, hogy kategóriákba sorolná őket.

from sklearn import datasets, linear_model
from sklearn.model_selection import train_test_split
from matplotlib import pyplot as plt

Képzési és tesztelési változókat kell létrehoznunk adatszivárgás nélkül, hogy azokat a transzformáció és skálázás előtt kettéválaszthassam,

X_train = train_X_principalDf
y_train =train_X['Apparent Temperature (C)']

X_test =test_X_principalDf
y_test = test_X['Apparent Temperature (C)']

print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)

Az alábbi kód követésével adatkészletünket a modellbe illeszthetjük,

lm = linear_model.LinearRegression()
model = lm.fit(X_train, y_train)
y_hat = lm.predict(X_test)

Az alábbi kód követésével a tényleges értékeket, a várható értékeket illesztheti az adatkeretbe,

test_df =pd.DataFrame({
              'actual':y_test,
              'prediction':y_hat,
              'diff':(y_test-y_hat)})
test_df.head(10)

Néha a fenti adatkeretből láthatja, hogy a sorindexek nem a sorrendben vannak, így az alábbi kód követésével visszaállíthatjuk az indexet, hogy elkerüljük a jövőbeni problémákat,

test_df=test_df.reset_index(drop=True)
test_df.head(10) # For Verification After reset the index you can see that its start from zero

A modell W paramétereit az alábbi kóddal kaphatja meg,

print(lm.coef_)

A kimenet: [-0,10932573 -0,36122572 6,42501305 -2,51270569 -0,80607153 -4,50456051 -6,51199797]. coef_ a lineáris regresszióval becsült súlyok tömbjét adja meg. Ha a súlyoknak nagyok az értékei, akkor normalizálnunk kell az adatkészlet jellemzőit, és a modellhez regularizációt kell használni a súlyértékek csökkentésére.

A modell interceptjét az alábbi kóddal érheti el,

print(lm.intercept_)

A kimenet 10,854332003684775. A lineáris regressziós analízis konstans tagja olyan egyszerű dolognak tűnik. Más néven y metszéspont, ez egyszerűen az az érték, amelynél az illesztett egyenes metszi az y tengelyt.

A következő kóddal megrajzolhatjuk a grafikont a Prediction vs Actual,

plt.plot(test_df['prediction'][:500], label = "Pred")  # Load the 500 data points from prediction with label name 'Pred'
plt.plot(test_df['actual'][:500], label = "Actual")    # Load the 500 data points from actual with label name 'Actual'

plt.xlabel('x - axis')              # Set the x axis label of the current axis.
plt.ylabel('y - axis')              # Set the y axis label of the current axis.
plt.title('Predicitons vs Actual')  # Set a title of the current axes.
plt.legend()                        # show a legend on the plot
plt.show()                          # Display a figure.

A kimeneti diagramok

Az alábbi kód követésével kiszámíthatjuk a betanított modell négyzetes középhibáját,

from math import sqrt
from sklearn.metrics import mean_squared_error
rmsq = sqrt(mean_squared_error(y_test, y_hat))
rmsq

A kimenet 1.2070026749031717

Az alábbi kód követésével kiszámíthatjuk a betanított modell átlagos négyzetes hibáját,

from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, y_hat)

A kimenet 1,4568554572234116

Az alábbi kód követésével kiszámíthatjuk az előrejelzések magyarázott variancia százalékát,

print(lm.score(X_test,y_test))

A kimenet 0,9873428171393527

Az alábbi kódot követve kiszámíthatjuk a modell keresztbe becsült pontosságát,

# Necessary imports: 
from sklearn.model_selection import cross_val_score, cross_val_predict
from sklearn import metrics
accuracy = metrics.r2_score(y_test, y_hat)
print("Cross-Predicted Accuracy:", accuracy)

Keresztre becsült pontosság: 0,9873428171393528

Az alábbi kód követésével létrehozhatja az eloszlási diagramot, amelyet arra használunk, hogy megvizsgáljuk a modellünk tényleges és előrejelzett értékek eloszlását. Eloszlási diagram készíthető az sns.distplot(),

plt.rcParams["figure.figsize"] = (24, 8)
sns.distplot(y_test,hist=False,color ="r",label="Test")
sns.distplot(y_hat,hist=False,color ="b",label="HAT")

Köszönöm, hogy elolvasta cikkem — — — -| ) Írta: Thanusan S.