क्या कृत्रिम बुद्धिमत्ता सटोरियों को बिना काम के छोड़ सकती है?

"फुटबॉल विशेषज्ञों पर कृत्रिम बुद्धि की जीत" - यह एक फुटबॉल प्रतियोगिता के परिणामों के बारे में इस लेख का शीर्षक हो सकता है। सकता है, लेकिन, अफसोस, नहीं किया।

विश्व कप के दौरान, हमारी कंपनी " NORBIT " में फुटबॉल के लिए सर्वश्रेष्ठ पूर्वानुमान मैचों के लिए एक प्रतियोगिता आयोजित की गई। मैं कुछ भी दावा करने के लिए फुटबॉल में बहुत अधिक पारंगत हूं, लेकिन प्रतियोगिता में भाग लेने की इच्छा अभी भी मेरे आलस्य पर जीती है। कट के तहत - मशीन लर्निंग के लिए धन्यवाद, मैं कैसे फुटबॉल टीमों के विशेषज्ञों के बीच अच्छे परिणाम प्राप्त करने में कामयाब रहा। सच है, मैं जैकपॉट को हिट करने में विफल रहा, लेकिन मैंने डेटा साइंस की एक नई आकर्षक दुनिया की खोज की।


मैंने इस परिकल्पना के साथ शुरू किया कि, राष्ट्रीय टीम के खिलाड़ियों के व्यक्तिगत कौशल के अलावा, अभी भी अथाह लेकिन महत्वपूर्ण कारक हैं - टीम भावना + टीमवर्क (उदाहरण के लिए, एक मजबूत प्रतिद्वंद्वी वाले खेल में एक टीम, लेकिन टेस्ट मैच में और अपने क्षेत्र में अधिक बार जीतता है)। कार्य किसी व्यक्ति के लिए इतना सरल नहीं है, लेकिन मशीन सीखने के लिए काफी समझ में आता है।

मुझे एक बार ML (BrainJS लाइब्रेरी के साथ) काम करने का थोड़ा अनुभव था, लेकिन इस बार मैंने इस कथन की जाँच करने का निर्णय लिया कि पायथन इस तरह के कार्यों के लिए अधिक उपयुक्त है।

मैंने कौरसेरा पर एक उत्कृष्ट पाठ्यक्रम के साथ पायथन से अपना परिचय शुरू किया, और मैंने हेबरे पर ओपन डेटा साइंस के लेखों की एक श्रृंखला से मशीन सीखने की मूल बातें सीखीं।

बहुत जल्दी से XX सदी की शुरुआत से अंतरराष्ट्रीय टीमों के सभी खेलों के इतिहास के साथ एक महान डेटासेट मिला। पंडों के डेटाफ्रेम में आयात करने के बाद:


कुल मिलाकर, डेटाबेस में अंतरराष्ट्रीय टीमों के 39 हजार खेलों की जानकारी है।

पंडों ने डेटा का विश्लेषण करना बहुत सुविधाजनक बना दिया है, उदाहरण के लिए, सबसे अधिक उत्पादक मैच 2001 में ऑस्ट्रेलिया और अमेरिकी समोआ के बीच था, जो 31: 0 के स्कोर के साथ समाप्त हुआ।




अब आपको मैच के वर्ष में टीम के स्तर का एक उद्देश्य मूल्यांकन जोड़ना होगा। ये आकलन फीफा द्वारा संभाला जाता है।



लेकिन, दुर्भाग्य से, फीफा रेटिंग केवल 1992 से आयोजित की गई है। और, शेड्यूल को देखते हुए, टीम की रेटिंग में बदलाव के लिए अतिसंवेदनशील हैं, और मैं वास्तव में इस साल तक विश्व रैंकिंग में टीमों की स्थिति को औसत नहीं करना चाहता हूं।

यूईएफए अधिक पुराने समय से अपने आंकड़े रखता है, लेकिन मुझे एक तैयार डेटासेट नहीं मिला, इसलिए यह साइट बचाव में आ गई। Node.js के तहत इस तरह के कार्यों के लिए एक शक्तिशाली और सुविधाजनक चीयरियो है, लेकिन पायथन के तहत सब कुछ कम सरल नहीं निकला (मुझे इस साइट के व्यवस्थापक को माफ कर दें)।

वेब स्क्रैपिंग रैंकिंग
from requests import get from requests.exceptions import RequestException from contextlib import closing from bs4 import BeautifulSoup def query_url(url):    try: with closing(get(url, stream=True)) as resp:        if is_good_response(resp):        return resp.content else:         return None   except RequestException as e: log_error('Error during requests to {0} : {1}'.format(url, str(e))) return None def is_good_response(resp):    content_type = resp.headers['Content-Type'].lower()    return (resp.status_code == 200        and content_type is not None        and content_type.find('html') > -1) def log_error(e):    print(e) def parse_ranks(raw_html, year):    html = BeautifulSoup(raw_html, 'html.parser')    ranks = []    for tr in html.select('tr'):        tds = tr.select("td")    if len(tds) == 10:        rank = (year, tds[2].text, tds[7].text)        ranks.append(rank)    return ranks   def get_url(year):    if year in range(1960, 1999): method = 1    if year in range(1999, 2004): method = 2    if year in range(2004, 2009): method = 3    if year in range(2009, 2018): method = 4    if year in range(2018, 2019): method = 5    return f"https://kassiesa.home.xs4all.nl/bert/uefa/data/method{method}/crank{year}.html" ranks = [] for year in range(1960, 2019):    url = get_url(year)    print(url)    raw_html = query_url(url)    rank = parse_ranks(raw_html, year)    ranks += rank   with open('team_ranks.csv', 'w') as f:    writer = csv.writer(f , lineterminator='\n')    writer.writerow(['year', 'country', 'rank'])    for rank in ranks:    writer.writerow(rank) 


यूईएफए रेटिंग को जोड़ने के बाद रेटिंग में उतार-चढ़ाव (और भूराजनीतिक कास्टिंग के परिणामों के अनुसार देशों के नामों का एक छोटा संशोधन):


लेकिन यहां तक ​​कि यह टार के एक बैरल के बिना नहीं था - यूईएफए केवल यूरोपीय टीमों को रैंक करता है (कभी-कभी आपको यह सोचने की ज़रूरत है कि उनका उपयोग करने से पहले आम संक्षिप्त के तहत क्या छिपा हुआ है)। सौभाग्य से, प्लेऑफ़ ने लगभग "यूरोपीय" विकसित किया है।

परिणामों को अलग-अलग खेलों में विभाजित करने और तालिका में रेटिंग जोड़ने के लिए यह थोड़ा अधिक सुविधाजनक है।

सबसे दिलचस्प हिस्सा मॉडल प्रशिक्षण है। Google ने तुरंत सबसे आसान और सबसे तेज़ विकल्प सुझाया - यह पायथन लाइब्रेरी - स्केलेरन से MLPClassifier है। आइए स्वीडन के उदाहरण का उपयोग करके एक मॉडल को प्रशिक्षित करने का प्रयास करें।

 from sklearn.neural_network import MLPClassifier games = pd.read_csv('games.csv') #    SwedenGames = games[(games.teamTitle == 'Sweden')] #   y = SwedenGames['score'] y = y.astype('int') #   X = SwedenGames.drop(['score', 'teamTitle', 'againstTitle'], axis=1) #       X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25) mlp = MLPClassifier() mlp.fit(X_train, y_train); predictions = mlp.predict(X_test) print('Accuracy: {:.2}'.format(   accuracy_score(y_test, mlp.predict(X_test)) )) 

सटीकता: 0.62

सिक्का उछालने की तुलना में बहुत अधिक सटीक नहीं है, लेकिन शायद पहले से ही मेरे संभावित "विशेषज्ञ" पूर्वानुमानों से बेहतर है। यह उचित होगा कि डेटा को समृद्ध करने की कोशिश करें, हाइपरपैरेटर्स के साथ खेलें, लेकिन मैंने दूसरे रास्ते पर जाने का फैसला किया और यांडेक्स ग्रेडिएंट कैटोबॉस्ट लाइब्रेरी ऑफ बूस्टिंग की कोशिश की। एक तरफ, यह अधिक देशभक्ति है, दूसरी ओर, वे श्रेणीबद्ध विशेषताओं के साथ गुणवत्ता वाले काम का वादा करते हैं, जो कई तुलनाओं द्वारा पुष्टि की जाती है।

उदाहरण से सेटिंग लिया:

 #     categorical_features_indices = [1, 2, 4] train_pool = Pool(X_train,  y_train, cat_features=categorical_features_indices) validate_pool = Pool(X_test, y_test, cat_features=categorical_features_indices) #      ,      GridSearchCV.   best_params = {   'iterations': 500,   'depth': 10,   'learning_rate': 0.1,   'l2_leaf_reg': 1,   'eval_metric': 'Accuracy',   'random_seed': 42,   'logging_level': 'Silent',   'use_best_model': True } cb_model = CatBoostClassifier(**best_params) cb_model.fit(train_pool, eval_set=validate_pool) print('Accuracy: {:.2}'.format(   accuracy_score(y_test, cb_model.predict(X_test)) )) 

सटीकता: 0.73

पहले से बेहतर, अभ्यास में प्रयास करें।

 def get_prediction(country, against):   y = SwdenGames['score']   y = y.astype('int')   X = SwdenGames.drop(['score', 'againstTitle'], axis=1)   train_pool = Pool(X, y, cat_features=[1, 2, 4])   query = [ get_team_rank(country, 2018), 0,   1 if country == 'Russia' else 0,   get_team_rank(against, 2018),   against]   return cb_model.predict_proba([query])[0] team_1 = 'Belgium' team_2 = 'France' result = get_prediction(team_1, team_2) if result[0] > result[1]:   print(f" {team_1}    {team_2}   {result[0]*100:.1f}%") else: print(f" {team_1}   {team_2}   {result[1]*100:.1f}%") 


अंतिम परिणाम के लिए भविष्यवाणी "93.7% संभावना के साथ फ्रांस टीम के लिए क्रोटिया टीम लॉस"

हालांकि इस बार मैं NORBIT प्रतियोगिता नहीं जीत पाया , लेकिन मुझे वास्तव में उम्मीद है कि यह लेख मशीन सीखने के व्यावहारिक उपयोग में किसी के लिए जादू के स्तर को कम करेगा, या शायद मुझे अपने स्वयं के प्रयोगों को करने के लिए भी प्रेरित करेगा।

Source: https://habr.com/ru/post/hi427273/


All Articles