# სტუდენტთა მომავლის პროგნოზირება: დაკარგული კოდის საიდუმლო


## 🧠 ისტორია:


წარმოიდგინეთ, რომ თქვენ ხართ ახალგაზრდა მონაცემთა მეცნიერები საქართველოს განათლების კვლევის ინსტიტუტში (სგკი). ინსტიტუტი წლებია მუშაობს მნიშვნელოვან პროექტზე, მათ შორის ერთ-ერთი ყველაზე მნიშვნელოვანი პროექტია -  სტუდენტების აკადემიური გზის პროგნოზირება. ამ პროექტის მიზანია დროულად აღმოაჩინონ დახმარების საჭიროების მქონე სტუდენტები და შეუმცირონ სწავლის მიტოვების რისკები.


წლების წინ, ინსტიტუტის სამმა სხვადასხვა, ლეგენდარულმა მკვლევართა ჯგუფმა შექმნა უნიკალური, მაგრამ ვიწროდ სპეციალიზებული, ხელოვნურ ინტელექტზე დაფუძნებული მოდელები. თითოეული მოდელი განსხვავებულ, კონკრეტულ კითხვაზე სცემდა პასუხს:


* **"ალფა" მოდელი:** განსაკუთრებით კარგად არჩევს, დაამთავრებს სტუდენტი უნივერსიტეტს წარმატებით (**Graduate**) თუ მიატოვებს სწავლას (**Dropout**).
* **"ბეტა" მოდელი:** მისი სიძლიერეა იმის გარჩევა, დაასრულებს სტუდენტი სწავლას (**Graduate**) თუ დარჩება აქტიურ სტუდენტად (**Enrolled**) მომდევნო პერიოდში.
* **"გამა" მოდელი:** ეს მოდელი ფოკუსირებულია იმის პროგნოზირებაზე, მიატოვებს სტუდენტი სწავლას (**Dropout**) თუ გააგრძელებს აქტიურ სტატუსში ყოფნას (**Enrolled**).


ეს მოდელები თავის დროზე რევოლუციური იყო, მაგრამ სამწუხაროდ, მკვლევართა ჯგუფები დაიშალა, დეტალური დოკუმენტაცია დაიკარგა და ორიგინალი კოდის სრულად აღდგენა შეუძლებელია. ინსტიტუტს კი ახლა სჭირდება ერთიანი, ჰოლისტიკური სისტემა, რომელიც შეძლებს ნებისმიერი სტუდენტისთვის სამი შესაძლო სტატუსიდან (**Graduate**, **Dropout**, **Enrolled**) ერთ-ერთის ზუსტ პროგნოზირებას.


## 🎯 თქვენი მისია:


თქვენ გადმოგეცათ ამ სამი "მემკვიდრეობით მიღებული" მოდელის სამუშაო ვერსიები და სატრენინგო მონაცემების ნაწილი. თქვენი ამოცანაა, შეიმუშაოთ მექანიზმი, რომელიც დაეყრდნობა "ალფა", "ბეტა" და "გამა" მოდელების პროგნოზებს და მათ საფუძველზე მიიღებს საბოლოო, ერთიან გადაწყვეტილებას თითოეული სტუდენტის მომავალი სტატუსის შესახებ. ფოკუსირება მოახდინეთ იმაზე, თუ როგორ შეიძლება ამ სამი სპეციალიზებული მოდულის "სიბრძნის" გაერთიანება და გამოყენება ერთიან სისტემაში.


## ⚙️ ფორმალური დავალება:


შექმენით საბოლოო კლასიფიკაციის სისტემა, რომელიც იღებს სტუდენტის მონაცემებს და იყენებს სამი წინასწარ არსებული ბინარული კლასიფიკატორის (ალფა: Graduate/Dropout, ბეტა: Graduate/Enrolled, გამა: Dropout/Enrolled) გამომავალ შედეგებს, რათა მოახდინოს სტუდენტის საბოლოო სტატუსის კლასიფიცირება სამ კატეგორიად: Graduate, Dropout, Enrolled.


## ⚠️ მნიშვნელოვანი შეზღუდვა:


თქვენი საბოლოო გადაწყვეტილების მექანიზმი `აუცილებლად` უნდა იყენებდეს ამ `სამი მოცემული მოდელის პროგნოზებს`, როგორც გადაწყვეტილების მიღების პროცესის ნაწილს. `დაუშვებელია` ისეთი ერთიანი, საბოლოო კლასიფიკატორის შექმნა, რომელიც `მხოლოდ საწყის მონაცემებს` გამოიყენებს და მთლიანად `უგულებელყოფს` ამ სამი სპეციალიზებული მოდულის მიერ მოწოდებულ ინფორმაციას (მათ პროგნოზებს/ალბათობებს). თქვენი ამოცანა სწორედ არსებული მოდულების პროგნოზების `ჭკვიანურად ინტეგრირებაა` და `არა მათი სრული ჩანაცვლება` ახალი, დამოუკიდებელი მოდელით, რომელიც `მხოლოდ` თავდაპირველ მონაცემებზე იქნებოდა დაფუძნებული. იფიქრეთ, როგორ შეიძლება ამ სამი განსხვავებული "ექსპერტის" აზრის გათვალისწინება საბოლოო დასკვნის გამოსატანად.


## 📁 მოწოდებული მასალები და მონაცემები:


თქვენ გადმოგეცემათ შემდეგი ფაილები:


* `train_data.csv`: ეს ფაილი შეიცავს სატრენინგო მონაცემებს სტუდენტების შესახებ, შემდეგი სვეტებით: `Tuition fees up to date`, `Age at enrollment`, `Mother's qualification`, `Curricular units 1st sem (enrolled)`, `Curricular units 1st sem (without evaluations)`, `Curricular units 2nd sem (grade)`. ასევე მოცემულია სამიზნე ცვლადი (`Target`), რომელიც აღნიშნავს სტუდენტის რეალურ საბოლოო სტატუსს: Graduate, Dropout, ან Enrolled. ეს მონაცემები შეგიძლიათ გამოიყენოთ თქვენი ინტეგრაციის სტრატეგიის შესამუშავებლად და შესამოწმებლად.
* `test_data.csv`: ეს ფაილი შეიცავს იმ სტუდენტების მონაცემებს (იგივე სვეტები, გარდა `Target`-ისა), რომლებისთვისაც უნდა გააკეთოთ საბოლოო პროგნოზი. ფაილში სტრიქონების ინდექსაცია იწყება 0-დან.
* `models.pickle`: ეს ფაილი შეიცავს Python-ის dictionary-ს (ლექსიკონს), სადაც შენახულია ის სამი წინასწარ გაწვრთნილი, სპეციალიზებული ლოჯისტიკური რეგრესიის მოდელი ("ალფა", "ბეტა", "გამა"), რომლებიც ისტორიაში ვახსენეთ. ლექსიკონის key (გასაღები) არის კლასების წყვილი tuple-ის სახით, რომელიც აჩვენებს, თუ რომელი ორი კლასის გარჩევა შეუძლია შესაბამის მოდელს, მაგალითად: `('Graduate', 'Dropout')`. ლექსიკონის value (მნიშვნელობა) არის შესაბამისი scikit-learn `LogisticRegression` მოდელი (მაგ. `LogisticRegression(random_state=42)`). თქვენ უნდა გამოიყენოთ ეს მოდელები მათი შესაბამისი კლასების წყვილებზე პროგნოზების მისაღებად.


## 📦 ჩასაბარებელი მასალები:


* ეს Jupyter Notebook-ი, თქვენი სრული ამონახსნის კოდით, რომელიც აღწერს თქვენს მიერ შემუშავებულ ინტეგრაციის მექანიზმს და `ავტომატურად ქმნის პროგნოზების ფაილს notebook-ის სრული გაშვების („Run all"-ის) შემდეგ`.
* `predictions.json`: JSON ფორმატის ფაილი, რომელიც შეიცავს თქვენი სისტემის პროგნოზებს `test_data.csv`-ში მოცემული თითოეული სტუდენტისთვის.
   * ფაილის key (გასაღები) უნდა იყოს სტრიქონის შესაბამისი ინდექსი `test_data.csv` ფაილიდან (სტრიქონის ტიპად, მაგ. `"0"`, `"1"`, `"2"`, ...).
   * ფაილის value (მნიშვნელობა) უნდა იყოს თქვენი სისტემის მიერ პროგნოზირებული კლასი ამ სტუდენტისთვის: Graduate, Dropout, ან Enrolled (სტრიქონის სახით).


   მაგალითი `predictions.json` ფაილის შიგთავსისა:
   ```json
   {
     "0": "Graduate",
     "1": "Dropout",
     "2": "Enrolled",
     "3": "Graduate",
     ...
   }
   ```


## 🏆 შეფასება:
გთხოვთ გაითვალისწინოთ, რომ ამ დავალებაში ჩვენი გუნდის ამოხსნის მაქსიმალური F1 ქულა არის 0.75. თქვენ თითოეულ საბმიშენზე დაგიბრუნდებათ თქვენი პასუხების F1 ქულა. ამ ამოცანის საბოლოო შედეგი გამოითვლება შემდეგნაირად: `Max`(0.75-სა, სტუდენტების საბმიშენების მაქსიმალურ ქულა) აღებული იქნება როგორც 100 ქულა, ხოლო თქვენი ინდივიდუალური ქულა დაანგარიშდება ექსპონენციალური ფორმულის გამოყენებით.


წარმატებებს გისურვებთ დაკარგული კოდის საიდუმლოს ამოხსნასა და სტუდენტთა მომავლის პროგნოზირებაში!




## საწყისი კოდი
იხილეთ საწყისი ინფორმაციის ჩატვირთვის და საბოლოო აუთფუთის შექმნის ინსტრუქციები. გთხოვთ ბოლო ნაწილში მხოლოდ ის ნაწილი შეცვალეთ სადაც პასუხს ინახავთ Dict-ში შენახვა განსაკუთრებით კი ფაილის სახელი არ შეცვალოთ წინააღმდეგ შემთხვევაში დაგიბრუნდებათ 0 ქულა.


```python
import pandas as pd
import pickle

# გაითვალისწინეთ რომ აქ უნდა ჩასვათ path რომელსაც ბორიუმის ნოუთბუქში ნახავთ
with open("models.pickle", 'rb') as f:
   models = pickle.load(f)

# გაითვალისწინეთ რომ აქ უნდა ჩასვათ path რომელსაც ბორიუმის ნოუთბუქში ნახავთ
training_data = pd.read_csv("train_data.csv")
training_data



# გაითვალისწინეთ რომ აქ უნდა ჩასვათ path რომელსაც ბორიუმის ნოუთბუქში ნახავთ
test_x = pd.read_csv("test_data.csv")
test_x


# თქვენი კოდი
# ...
# ...




import json

# შეგიძლიათ ამ ფუნქციის პარამეტრებიც შეცვალოთ მთავარია ბოლოს submission.json #შემქნათ იმ პრინციპით როგორც აქ წერია
def create_predictions_json(test_data):
   """
   Creates submission.json file. Currently outputs 'Graduate' for all students.
   TODO: Replace hardcoded 'Graduate' with actual model predictions.
   Do not modify the JSON saving part at the end.
   """
   predictions = {}
   for idx in range(len(test_data)):
       # TODO: Add prediction logic here using Alpha, Beta, Gamma models
       final_prediction = "Graduate"  # Replace with actual prediction
      
       predictions[str(idx)] = final_prediction


   # DO NOT MODIFY
   with open('submission.json', 'w') as f:
       json.dump(predictions, f, indent=4)


   print(f"Predictions saved to submission.json with {len(predictions)} entries")


create_predictions_json(test_x)
```
