From 1d7aa10b5768b805d59ca74ccbd17b265f359cb1 Mon Sep 17 00:00:00 2001 From: Anna Nowak Date: Sun, 25 Apr 2021 17:39:38 +0200 Subject: [PATCH] trenowanie modelu, wytrenowany model --- .gitignore | 5 +- Dockerfile | 3 +- Zadanie 1.py | 239 ++- evaluation_result.txt | 2 + model.h5 | Bin 0 -> 43696 bytes requirements.txt | 10 +- results.csv | 3330 +++++++++++++++++++++++++++++++++++++++++ train.py | 56 + 8 files changed, 3635 insertions(+), 10 deletions(-) create mode 100644 evaluation_result.txt create mode 100644 model.h5 create mode 100644 results.csv create mode 100644 train.py diff --git a/.gitignore b/.gitignore index 3c7b23a..b424dc9 100644 --- a/.gitignore +++ b/.gitignore @@ -57,6 +57,9 @@ docs/source/changelog.md #fifa dataset fifa19* -*.csv +data.csv +test.csv +train.csv +dev.csv stat.txt .venv/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index edede8b..33f6041 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,4 +7,5 @@ COPY ["requirements.txt", "./"] RUN pip3 install -r requirements.txt COPY ["Zadanie 1.py", "."] -COPY ["stats.py", "."] \ No newline at end of file +COPY ["stats.py", "."] +COPY ["train.py", "."] \ No newline at end of file diff --git a/Zadanie 1.py b/Zadanie 1.py index e5bdf34..90cb5ea 100644 --- a/Zadanie 1.py +++ b/Zadanie 1.py @@ -3,6 +3,236 @@ import os import pandas as pd from sklearn.model_selection import train_test_split +positions=['RF', 'ST', 'LW', 'GK', 'RCM', 'LF', 'RS', 'RCB', 'LCM', 'CB', + 'LDM', 'CAM', 'CDM', 'LS', 'LCB', 'RM', 'LM', 'LB', 'RDM', 'RW', + 'CM', 'RB', 'RAM', 'CF', 'LAM', 'RWB', 'LWB'] + +nationalities=['Argentina', 'Portugal', 'Brazil', 'Spain', 'Belgium', 'Croatia', + 'Uruguay', 'Slovenia', 'Poland', 'Germany', 'France', 'England', + 'Italy', 'Egypt', 'Denmark', 'Gabon', 'Wales', 'Senegal', + 'Costa Rica', 'Slovakia', 'Netherlands', 'Bosnia Herzegovina', + 'Morocco', 'Serbia', 'Algeria', 'Austria', 'Greece', 'Chile', + 'Sweden', 'Colombia', 'Korea Republic', 'Finland', 'Guinea', + 'Montenegro', 'Armenia', 'Switzerland', 'Norway', 'Czech Republic', + 'Scotland', 'Ghana', 'Central African Rep.', 'DR Congo', + 'Ivory Coast', 'Russia', 'Ukraine', 'Iceland', 'Mexico', 'Jamaica', + 'Albania', 'Venezuela', 'Japan', 'Turkey', 'Ecuador', 'Paraguay', + 'Mali', 'Nigeria', 'Cameroon', 'Dominican Republic', 'Israel', + 'Kenya', 'Hungary', 'Republic of Ireland', 'Romania', + 'United States', 'Cape Verde', 'Australia', 'Peru', 'Togo', + 'Syria', 'Zimbabwe', 'Angola', 'Burkina Faso', 'Iran', 'Estonia', + 'Tunisia', 'Equatorial Guinea', 'New Zealand', 'FYR Macedonia', + 'United Arab Emirates', 'China PR', 'Guinea Bissau', 'Bulgaria', + 'Kosovo', 'South Africa', 'Madagascar', 'Georgia', 'Tanzania', + 'Gambia', 'Cuba', 'Belarus', 'Uzbekistan', 'Benin', 'Congo', + 'Mozambique', 'Honduras', 'Canada', 'Northern Ireland', 'Cyprus', + 'Saudi Arabia', 'Curacao', 'Moldova', 'Bolivia', + 'Trinidad & Tobago', 'Sierra Leone', 'Zambia', 'Chad', + 'Philippines', 'Haiti', 'Comoros', 'Libya', 'Panama', + 'São Tomé & Príncipe', 'Eritrea', 'Oman', 'Iraq', 'Burundi', + 'Fiji', 'New Caledonia', 'Lithuania', 'Luxembourg', 'Korea DPR', + 'Liechtenstein', 'St Kitts Nevis', 'Latvia', 'Suriname', 'Uganda', + 'El Salvador', 'Kuwait', 'Antigua & Barbuda', 'Thailand', + 'Mauritius', 'Guatemala', 'Liberia', 'Kazakhstan', 'Niger', + 'Mauritania', 'Montserrat', 'Namibia', 'Azerbaijan', 'Guam', + 'Faroe Islands', 'Nicaragua', 'Barbados', 'Lebanon', 'Palestine', + 'Guyana', 'Sudan', 'Ethiopia', 'Puerto Rico', 'Grenada', 'Jordan', + 'Rwanda', 'Bermuda', 'Qatar', 'Afghanistan', 'Hong Kong', + 'Andorra', 'Belize', 'South Sudan', 'Indonesia', 'Botswana'] + +clubs = ['FC Barcelona', 'Juventus', 'Paris Saint-Germain', + 'Manchester United', 'Manchester City', 'Chelsea', 'Real Madrid', + 'Atlético Madrid', 'FC Bayern München', 'Tottenham Hotspur', + 'Liverpool', 'Napoli', 'Arsenal', 'Inter', 'Lazio', + 'Borussia Dortmund', 'Vissel Kobe', 'Olympique Lyonnais', 'Roma', + 'Valencia CF', 'FC Porto', 'FC Schalke 04', 'Beşiktaş JK', + 'LA Galaxy', 'Sporting CP', 'Real Betis', 'Olympique de Marseille', + 'RC Celta', 'Bayer 04 Leverkusen', 'Real Sociedad', + 'Villarreal CF', 'Sevilla FC', 'SL Benfica', 'AS Saint-Étienne', + 'AS Monaco', 'Leicester City', 'Atalanta', 'Grêmio', + 'Atlético Mineiro', 'RB Leipzig', 'Ajax', 'Dalian YiFang FC', + 'Everton', 'Milan', 'West Ham United', '1. FC Köln', + 'TSG 1899 Hoffenheim', 'Shanghai SIPG FC', 'OGC Nice', 'Al Nassr', + 'Wolverhampton Wanderers', 'Borussia Mönchengladbach', + 'Hertha BSC', 'SV Werder Bremen', 'Cruzeiro', + 'Athletic Club de Bilbao', 'Torino', 'Medipol Başakşehir FK', + 'Beijing Sinobo Guoan FC', 'Crystal Palace', 'PFC CSKA Moscow', + 'VfL Wolfsburg', 'Shakhtar Donetsk', 'Toronto FC', + 'Lokomotiv Moscow', 'Sassuolo', 'New York City FC', 'Fluminense', + 'PSV', 'Levante UD', 'Fulham', 'Watford', 'Atlanta United', + 'Montpellier HSC', 'Galatasaray SK', 'Fenerbahçe SK', 'SD Eibar', + 'Los Angeles FC', 'Sampdoria', 'Al Hilal', 'VfB Stuttgart', + 'SC Braga', 'River Plate', 'Deportivo Alavés', + 'Eintracht Frankfurt', 'Girona FC', 'Guangzhou R&F; FC', 'Burnley', + 'Stoke City', 'Southampton', 'Tianjin Quanjian FC', 'Getafe CF', + 'Beijing Renhe FC', 'Montreal Impact', 'Chievo Verona', 'Genoa', + 'Portland Timbers', 'Tigres U.A.N.L.', 'RCD Espanyol', + 'Hebei China Fortune FC', 'Cagliari', 'Chicago Fire', 'DC United', + 'Sagan Tosu', 'Dynamo Kyiv', 'Santos', 'Internacional', + 'América FC (Minas Gerais)', 'Independiente', 'Boca Juniors', + 'Cruz Azul', '1. FSV Mainz 05', 'Bournemouth', 'Spartak Moscow', + 'Racing Club', 'FC Augsburg', 'Fiorentina', 'FC Nantes', + 'Feyenoord', 'Club Brugge KV', 'Brighton & Hove Albion', + 'Guangzhou Evergrande Taobao FC', 'Al Ahli', 'Jiangsu Suning FC', + 'SC Freiburg', 'PAOK', 'Stade Rennais FC', 'Trabzonspor', 'SPAL', + 'Portimonense SC', 'Olympiacos CFP', 'Club Atlético Huracán', + 'Kasimpaşa SK', 'Newcastle United', 'Querétaro', 'KRC Genk', + 'Hannover 96', 'Stade Malherbe Caen', 'Godoy Cruz', + 'Toulouse Football Club', 'RSC Anderlecht', 'Huddersfield Town', + 'CD Tondela', 'Seattle Sounders FC', 'Hamburger SV', + 'FC Red Bull Salzburg', 'Rio Ave FC', 'FC Girondins de Bordeaux', + 'Melbourne Victory', 'Parma', 'FC Basel 1893', 'Al Wehda', + 'BSC Young Boys', 'KAA Gent', 'Al Ittihad', 'Standard de Liège', + 'Shanghai Greenland Shenhua FC', 'Colo-Colo', 'Junior FC', + 'West Bromwich Albion', 'RC Strasbourg Alsace', 'Göztepe SK', + 'Deportivo Cali', 'Deportivo Toluca', 'Bologna', 'Nagoya Grampus', + 'Amiens SC', 'Changchun Yatai FC', 'Club Atlético Lanús', + 'Botafogo', 'Club América', 'Udinese', 'Real Valladolid CF', + 'CD Leganés', 'Club Atlético Banfield', 'Celtic', + 'Vitória Guimarães', 'FC København', 'UD Las Palmas', + 'Deportivo de La Coruña', 'Universidad Católica', + 'San Lorenzo de Almagro', 'Rayo Vallecano', 'Monterrey', + 'Columbus Crew SC', 'MKE Ankaragücü', 'Guizhou Hengfeng FC', + 'Swansea City', 'Tianjin TEDA FC', + 'Chongqing Dangdai Lifan FC SWM Team', 'AEK Athens', 'Al Taawoun', + 'Melbourne City FC', 'En Avant de Guingamp', + 'Akhisar Belediyespor', 'Foggia', 'LOSC Lille', + 'Clube Sport Marítimo', 'Real Sporting de Gijón', 'BB Erzurumspor', + 'Shandong Luneng TaiShan FC', 'Bahia', 'Once Caldas', + 'FC Groningen', 'Angers SCO', 'Paraná', 'Antalyaspor', + 'Minnesota United FC', 'Club León', 'Empoli', 'Leeds United', + 'Viktoria Plzeň', 'Alanyaspor', 'Frosinone', 'Atlético Paranaense', + 'Derby County', 'Kawasaki Frontale', 'Aston Villa', 'Guadalajara', + 'Dijon FCO', 'Santos Laguna', 'Vitória', 'Çaykur Rizespor', + 'U.N.A.M.', 'Nottingham Forest', 'Royal Antwerp FC', + 'Club Tijuana', 'Sport Club do Recife', 'Real Salt Lake', + 'AZ Alkmaar', 'SK Slavia Praha', 'Willem II', 'Middlesbrough', + 'Dinamo Zagreb', 'Club Atlas', 'Granada CF', 'Sydney FC', + 'Sporting Kansas City', 'SV Zulte-Waregem', 'Málaga CF', + 'Real Oviedo', 'Pachuca', 'Boavista FC', 'Atiker Konyaspor', + 'Kaizer Chiefs', 'GD Chaves', 'Palermo', 'Atlético Nacional', + 'Puebla FC', 'Perth Glory', 'Panathinaikos FC', 'FC Sion', + 'New York Red Bulls', 'Al Shabab', 'Club Atlético Colón', + 'Monarcas Morelia', 'Albacete BP', 'Rangers FC', 'Sparta Praha', + 'Philadelphia Union', 'Legia Warszawa', 'Urawa Red Diamonds', + 'Rosario Central', 'Stade de Reims', 'ADO Den Haag', 'Chapecoense', + 'FC Midtjylland', 'San Jose Earthquakes', 'Cardiff City', + 'Belgrano de Córdoba', '1. FC Nürnberg', 'Brescia', + 'Kashima Antlers', 'Vitória de Setúbal', + 'CD Everton de Viña del Mar', 'Fortuna Düsseldorf', 'SD Huesca', + 'Preston North End', 'Club Atlético Talleres', 'Benevento', + 'Gimnasia y Esgrima La Plata', 'Houston Dynamo', 'Club Necaxa', + 'Norwich City', 'Holstein Kiel', 'Ettifaq FC', 'Kayserispor', + '1. FC Heidenheim 1846', 'Vitesse', 'Brentford', + 'Yeni Malatyaspor', 'Ceará Sporting Club', 'FC Ingolstadt 04', + 'Estudiantes de La Plata', 'AIK', 'Queens Park Rangers', + 'Suwon Samsung Bluewings', 'Heart of Midlothian', 'Reading', + 'FC Dallas', 'Heracles Almelo', 'Bursaspor', 'Venezia FC', + 'CD Lugo', 'Henan Jianye FC', 'Orlando City SC', 'CA Osasuna', + 'Livorno', 'Universidad de Chile', 'Brøndby IF', 'Aberdeen', + 'Defensa y Justicia', 'Atlético Tucumán', 'Blackburn Rovers', + 'SV Darmstadt 98', 'Moreirense FC', 'Sanfrecce Hiroshima', + 'CD Numancia', 'KV Oostende', 'Vancouver Whitecaps FC', + 'Odense Boldklub', 'SC Heerenveen', 'Racing Club de Lens', + 'Independiente Santa Fe', 'Sporting de Charleroi', + 'Millonarios FC', 'Sheffield Wednesday', 'Perugia', 'Daegu FC', + 'Vélez Sarsfield', 'Grasshopper Club Zürich', 'Sivasspor', + 'Rosenborg BK', 'SK Sturm Graz', 'FC Metz', + 'CD Universidad de Concepción', 'Brisbane Roar', 'CD Feirense', + 'Hull City', 'Neuchâtel Xamax', 'Real Zaragoza', 'CD Aves', + 'Millwall', 'Unión de Santa Fe', 'KAS Eupen', 'Cádiz CF', + 'CD Tenerife', '1. FC Union Berlin', 'Al Fayha', 'AJ Auxerre', + 'Nîmes Olympique', 'Patriotas Boyacá FC', 'Molde FK', + 'Bristol City', 'CD Nacional', 'Sporting Lokeren', 'FC St. Pauli', + 'Deportes Iquique', 'Al Qadisiyah', 'Sheffield United', + 'Lobos BUAP', 'FC Utrecht', 'Club Atlético Tigre', + 'FK Austria Wien', 'Patronato', 'Malmö FF', 'Kashiwa Reysol', + 'US Cremonese', 'VfL Bochum 1848', 'SK Rapid Wien', + 'Hellas Verona', 'Rionegro Águilas', 'Lecce', 'Santa Clara', + 'BK Häcken', 'New England Revolution', 'Orlando Pirates', + 'Atlético Huila', 'Western Sydney Wanderers', 'Kalmar FF', + 'Independiente Medellín', 'Lech Poznań', 'Djurgårdens IF', + 'CF Reus Deportiu', 'SK Brann', 'Ulsan Hyundai FC', + 'Sint-Truidense VV', 'Al Fateh', 'Royal Excel Mouscron', + 'AC Ajaccio', 'PEC Zwolle', 'Sunderland', 'Club Atlético Aldosivi', + 'US Salernitana 1919', 'FC Lorient', 'Argentinos Juniors', + 'AD Alcorcón', 'Crotone', 'Excelsior', 'Gimnàstic de Tarragona', + 'FC Tokyo', 'KV Kortrijk', 'IFK Norrköping', 'Adelaide United', + 'FC St. Gallen', 'Tiburones Rojos de Veracruz', 'CD Palestino', + 'Jeju United FC', 'Deportes Tolima', 'Jeonbuk Hyundai Motors', + 'Birmingham City', 'América de Cali', 'La Equidad', 'Spezia', + 'Aalborg BK', 'Le Havre AC', 'KSV Cercle Brugge', 'Górnik Zabrze', + 'Wigan Athletic', 'Jagiellonia Białystok', 'Cittadella', + 'Hibernian', 'FC Lugano', 'San Martín de San Juan', + 'Strømsgodset IF', "Newell's Old Boys", 'Al Faisaly', + 'Colorado Rapids', 'IF Elfsborg', 'SV Sandhausen', 'Al Batin', + 'VVV-Venlo', 'Stade Brestois 29', 'UD Almería', 'Gyeongnam FC', + 'Yokohama F. Marinos', 'Kilmarnock', 'Pescara', 'Newcastle Jets', + 'Central Coast Mariners', 'Córdoba CF', 'RCD Mallorca', + 'Hammarby IF', 'Cerezo Osaka', 'KFC Uerdingen 05', + 'Shimizu S-Pulse', 'MSV Duisburg', 'Os Belenenses', + 'DSC Arminia Bielefeld', 'Ipswich Town', 'FC Seoul', + 'Lechia Gdańsk', 'Gamba Osaka', 'CF Rayo Majadahonda', 'Carpi', + 'LASK Linz', 'Bolton Wanderers', 'Al Raed', 'Extremadura UD', + 'SC Paderborn 07', 'Wellington Phoenix', 'Unión Española', + 'Alianza Petrolera', 'Cracovia', 'Gangwon FC', 'Júbilo Iwata', + 'Elche CF', 'AS Béziers', 'La Berrichonne de Châteauroux', + 'Clermont Foot 63', 'ESTAC Troyes', 'Pohang Steelers', 'Örebro SK', + 'Arka Gdynia', 'SG Dynamo Dresden', 'SpVgg Greuther Fürth', + 'Wisła Kraków', 'Stabæk Fotball', 'Eintracht Braunschweig', + 'Valenciennes FC', 'FC Thun', 'San Luis de Quillota', + 'Fortuna Sittard', ' SSV Jahn Regensburg', 'FC Nordsjælland', + 'FC Erzgebirge Aue', 'Jeonnam Dragons', 'Wolfsberger AC', + 'Chamois Niortais Football Club', 'Club Deportes Temuco', + 'AS Nancy Lorraine', 'Red Star FC', 'Al Hazem', 'Pogoń Szczecin', + 'Charlton Athletic', 'Grenoble Foot 38', 'FC Hansa Rostock', + 'San Martin de Tucumán', 'Incheon United FC', 'Śląsk Wrocław', + 'GFC Ajaccio', '1. FC Kaiserslautern', 'Waasland-Beveren', + 'Deportivo Pasto', 'Lincoln City', 'Motherwell', + 'Rotherham United', 'Burton Albion', 'Wisła Płock', + 'CD Huachipato', 'FC Wacker Innsbruck', 'Atlético Bucaramanga', + 'Peterborough United', 'Ascoli', 'FC Zürich', 'Fleetwood Town', + 'Padova', 'SV Wehen Wiesbaden', 'FC Sochaux-Montbéliard', + 'Unión La Calera', 'Scunthorpe United', 'NAC Breda', + '1. FC Magdeburg', "CD O'Higgins", 'CD Antofagasta', + 'Plymouth Argyle', 'Aarhus GF', 'Lillestrøm SK', 'Karlsruher SC', + 'GIF Sundsvall', 'FC Emmen', 'Barnsley', 'Audax Italiano', + 'V-Varen Nagasaki', 'Paris FC', 'SpVgg Unterhaching', 'Hobro IK', + 'De Graafschap', 'Hokkaido Consadole Sapporo', 'Tromsø IL', + 'FC Luzern', 'FK Haugesund', 'Zagłębie Lubin', 'VfR Aalen', + 'Dundalk', 'Piast Gliwice', 'Ohod Club', 'Östersunds FK', + 'Crawley Town', 'FC Admira Wacker Mödling', 'Vålerenga Fotball', + 'Oxford United', 'Dundee FC', 'Portsmouth', 'Envigado FC', + 'Miedź Legnica', 'Odds BK', 'SC Fortuna Köln', 'Cosenza', + 'US Orléans Loiret Football', 'Sarpsborg 08 FF', + 'Jaguares de Córdoba', 'Bradford City', 'St. Johnstone FC', + 'Boyacá Chicó FC', 'SV Mattersburg', 'Luton Town', + 'Kristiansund BK', 'Sangju Sangmu FC', 'Walsall', 'Korona Kielce', + 'Shonan Bellmare', 'FC Würzburger Kickers', 'FSV Zwickau', + 'St. Mirren', 'AC Horsens', 'HJK Helsinki', 'Accrington Stanley', + 'Southend United', 'Bristol Rovers', 'Hamilton Academical FC', + 'TSV 1860 München', 'Curicó Unido', 'SCR Altach', + 'Ranheim Fotball', 'Stevenage', 'SG Sonnenhof Großaspach', + 'Oldham Athletic', 'Milton Keynes Dons', 'FK Bodø/Glimt', + 'SC Preußen Münster', 'Vejle Boldklub', 'Vegalta Sendai', 'Bury', + 'Randers FC', 'VfL Osnabrück', 'SønderjyskE', 'IFK Göteborg', + 'Mansfield Town', 'Coventry City', 'Esbjerg fB', 'Waterford FC', + 'Shrewsbury', 'IK Start', 'Rochdale', 'Gillingham', + 'FC Energie Cottbus', 'FC Carl Zeiss Jena', 'Hallescher FC', + 'Wycombe Wanderers', 'AFC Wimbledon', 'Blackpool', + 'Doncaster Rovers', 'Sandefjord Fotball', 'VfL Sportfreunde Lotte', + 'Cheltenham Town', 'IK Sirius', 'Vendsyssel FF', 'Swindon Town', + 'SV Meppen', 'Notts County', 'SKN St. Pölten', 'Exeter City', + 'Northampton Town', 'Shamrock Rovers', 'Colchester United', + 'Livingston FC', 'TSV Hartberg', 'Tranmere Rovers', + 'Cambridge United', 'Grimsby Town', 'Port Vale', + 'Itagüí Leones FC', 'Forest Green Rovers', 'Dalkurd FF', + 'Zagłębie Sosnowiec', 'Carlisle United', 'Trelleborgs FF', + "St. Patrick's Athletic", 'Morecambe', 'Cork City', + 'IF Brommapojkarna', 'Crewe Alexandra', 'Yeovil Town', + 'Bohemian FC', 'Macclesfield Town', 'Newport County', + 'Sligo Rovers', 'Derry City', 'Limerick FC', 'Bray Wanderers'] + if os.getenv("KAGGLE_KEY") is None or os.getenv("KAGGLE_USERNAME") is None: print("Brak zmiennych środowiskowych KAGGLE_KEY lub KAAGLE_USERNAME") exit() @@ -17,9 +247,10 @@ df=pd.read_csv('data.csv') df = df[df["Release Clause"].notna()] df = df[df["Release Clause"].notnull()] -if df["Overall"].mean() > 1: - df["Overall"]= df["Overall"]/100 - +df["Age"]= df["Age"]/50 +df["Nationality"] = df["Nationality"].apply(nationalities.index)/(len(nationalities)-1) +df["Position"] = df["Position"].apply(positions.index)/(len(positions)-1) +df["Club"] = df["Club"].apply(clubs.index)/(len(clubs)-1) df["Release Clause"] = df["Release Clause"].str.replace("€", "") df["Release Clause"] = (df["Release Clause"].replace(r'[KM]+$', '', regex=True).astype(float) * @@ -28,7 +259,7 @@ df["Release Clause"] = (df["Release Clause"].replace(r'[KM]+$', '', regex=True). df.to_csv('data.csv') train, dev = train_test_split(df, train_size=0.6, test_size=0.4, shuffle=True) -dev, test = train_test_split(dev, train_size=0.5, test_size=0.5, shuffle=False) +dev, test = train_test_split(dev, train_size=0.5, test_size=0.5, shuffle=True) test.to_csv('test.csv') dev.to_csv('dev.csv') diff --git a/evaluation_result.txt b/evaluation_result.txt new file mode 100644 index 0000000..3dd762b --- /dev/null +++ b/evaluation_result.txt @@ -0,0 +1,2 @@ +Train: 25.844615936279297 +Test: 25.38555335998535 \ No newline at end of file diff --git a/model.h5 b/model.h5 new file mode 100644 index 0000000000000000000000000000000000000000..beac43e8bd1045a9109434649e27ca79f7754ebe GIT binary patch literal 43696 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