ium_407409/model_train.py

113 lines
5.3 KiB
Python

import tensorflow as tf
import pandas as pd
import numpy as np
import sklearn
#Wczytanie i obróbka całości danych
big_dataset = pd.DataFrame()
#Trzeba wczytać każdy z 13 arkuszy z danymi dla poszczególnych okręgów wyborczych
for i in range(1,14):
filename = '2019-european-parliament-election-in-poland-data\wyniki_gl_na_kand_po_obwodach_sheet_'+str(i)+'.csv'
data_district = pd.read_csv(filename)
data_district['obwod'] = i
df = data_district.copy()
cols_to_remove = []
for c in range(35,len(df.columns)):
cols_to_remove.append(c)
#Wycięcie nadmiarowych danych - szczegółowych informacji o głosach na poszczególnych kandydatów w poszczególnych komisjach
df.drop(df.columns[cols_to_remove],axis=1,inplace=True)
#Uwzględnienie w danych zbiorczych wyników komitetów wyborczych w poszczególnych komisjach
df['Konfederacja'] = data_district['Lista nr 1 - KWW KONFEDERACJA KORWIN BRAUN LIROY NARODOWCY']
df['Wiosna'] = data_district['Lista nr 2 - KW WIOSNA ROBERTA BIEDRONIA']
df['Koalicja Europejska'] = data_district['Lista nr 3 - KKW KOALICJA EUROPEJSKA PO PSL SLD .N ZIELONI']
df['Prawo i Sprawiedliwość'] = data_district['Lista nr 4 - KW PRAWO I SPRAWIEDLIWOŚĆ']
df['Lewica Razem'] = data_district['Lista nr 5 - KKW LEWICA RAZEM - RAZEM, UNIA PRACY, RSS']
df['Kukiz15'] = data_district['Lista nr 6 - KWW KUKIZ\'15']
#Poniżej trzy komitety, które były zarejestrowane tylko w niektórych okręgach wyborczych
if 'Lista nr 7 - KWW POLSKA FAIR PLAY BEZPARTYJNI GWIAZDOWSKI' in data_district.columns:
df['Polska Fair Play'] = data_district['Lista nr 7 - KWW POLSKA FAIR PLAY BEZPARTYJNI GWIAZDOWSKI']
else:
df['Polska Fair Play'] = 0
if 'Lista nr 9 - KKW POLEXIT - KOALICJA' in data_district.columns:
df['POLEXIT'] = data_district['Lista nr 9 - KKW POLEXIT - KOALICJA']
else:
df['POLEXIT'] = 0
if 'Lista nr 10 - KW JEDNOŚĆ NARODU' in data_district.columns:
df['Jedność Narodu'] = data_district['Lista nr 10 - KW JEDNOŚĆ NARODU']
else:
df['Jedność Narodu'] = 0
#Dodanie kolumny przechowującej informację o tym, w którym okręgu znajduje się dana komisja
df['obwod'] = i
df['zwyciezca'] = 0
df.loc[ df['Prawo i Sprawiedliwość'] > df['Koalicja Europejska'], 'zwyciezca'] = 1
#Doklejenie wczytanych dla okręgu i obrobionych danych do głównego zbioru
big_dataset = pd.concat([big_dataset,df])
#print(big_dataset)
features = big_dataset.copy()
features['typ obszaru'] = 0
features.loc[ features['Typ obszaru'] == 'miasto', 'typ'] = 1
features['liczba uprawnionych'] = features['Liczba wyborców uprawnionych do głosowania']
features['liczba glosow'] = features['Liczba kart wyjętych z urny']
features['liczba glosow niewaznych'] = features['Liczba kart wyjętych z urny'] - features['Liczba głosów ważnych oddanych łącznie na wszystkie listy kandydatów']
features['wojewodztwo'] = 0
wojewodztwa = ['mazowieckie', 'małopolskie', 'wielkopolskie', 'zachodniopomorskie', 'pomorskie', 'warmińsko-mazurskie', 'lubuskie',
'dolnośląskie', 'śląskie', 'łódzkie', 'opolskie', 'kujawsko-pomorskie', 'podlaskie', 'świętokrzyskie', 'lubelskie',
'podkarpackie']
for i in range(len(wojewodztwa)):
features.loc[ features['Województwo'] == wojewodztwa[i], 'wojewodztwo'] = i
cols_to_remove = []
for c in range(0,44):
cols_to_remove.append(c)
#cols_to_remove.append(45)
cols_to_remove.append(47)
#Wycięcie nadmiarowych danych - szczegółowych informacji o głosach na poszczególnych kandydatów w poszczególnych komisjach
features.drop(features.columns[cols_to_remove],axis=1,inplace=True)
#Wyodrębnienie z danych zbioru testowego
from sklearn.model_selection import train_test_split
data_train, data_test = sklearn.model_selection.train_test_split(features, test_size=2700, random_state=1)
#Wyodrębnienie zbioru walidacyjnego z pozostałego zbioru treningowego
data_train, data_val = sklearn.model_selection.train_test_split(data_train, test_size=2700, random_state=1)
data_test.to_csv('data_test.csv', index = False)
train_labels = np.array(data_train['zwyciezca'])
val_labels = np.array(data_test['zwyciezca'])
data_train.drop(['zwyciezca'], axis=1, inplace=True)
data_val.drop(['zwyciezca'], axis=1, inplace=True)
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=[len(data_train.keys())]),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(1)
])
model.compile(optimizer=tf.keras.optimizers.RMSprop(),
loss='mse',
metrics=['mae', 'mse'])
#model.compile(optimizer='adam',
#loss='binary_crossentropy',
#metrics=['accuracy'])
#model.summary()
history = model.fit(tf.convert_to_tensor(data_train), tf.convert_to_tensor(train_labels), epochs=50, batch_size = 32,
validation_data=(tf.convert_to_tensor(data_val), tf.convert_to_tensor(val_labels)))
#callbacks=[tensorboard_callback])
train_loss = history.history['loss']
val_loss = history.history['val_loss']
# Zapisanie modelu do pliku
model.save('model_election.h5')