В датасете есть столбец score.
Твоя цель — придумать формулу, по которой значение score можно оценить из значений других
столбцов.
Мы сгенерировали данные так, чтобы существовала формула, которая для каждого заемщика точно
вычисляет значение score из значений других столбцов. Найти точную формулу может быть непросто, поэтому тебе нужно подобрать формулу, которая оценивает score максимально точно.
Твоя формула может использовать значения любых из 20 столбцов, описывающих заемщика: от name
до util_flg. На выходе формула должна возвращать одно число для каждого заемщика: оценку score. 

Для этого мне дали csv файл. Пример:
approve_dttm,utm_source,specialty,util_dttm,semester_cost_amt,pid,score,util_flg,approve_flg,initial_term,short_nm,initial_approved_amt,reject_reason,gender_cd,semestr_cnt,name,marketing_flag,education_level_code,age,subside_rate,create_dttm
,website,Электроника и наноэлектроника,,180000,75c824cf-b0a1-4151-8b03-ced3be323e22,0.83,0,0,2,Сибирский федеральный университет (СФУ),0.0,Заявитель найден в ЧС,M,4,Вениамин Георгиевич Шарапов,0,BACHELOR,16,3.2,2024-07-28
,website,Автоматизация и управление,,270000,c808c3f9-e770-4744-a9c7-153e606a696b,0.78,0,0,3,Московский государственный университет имени М.В. Ломоносова (МГУ),0.0,Недостаток документов,F,8,тов. Куликова Наталья Владимировна,0,BACHELOR,17,3.3,2024-07-24
2024-07-17,social_media,Информатика и вычислительная техника,2024-08-31,245000,46774c65-b983-4ffd-ad3b-a9f0fbc6cc5,0.65,1,1,4,Томский государственный университет (ТГУ),1960000.0,,M,8,Евгений Аверьянович Михайлов,1,BACHELOR,19,3.9,2024-06-14
2024-06-01,website,Прикладная математика,2024-08-25,200000,5f324ac9-99de-473d-815f-b9162957d623,0.65,1,1,2,Московский физико-технический институт (МФТИ),900000.0,,F,6,Смирнова Евдокия Вячеславовна,0,BACHELOR,19,3.6,2024-05-13
2024-08-01,website,Электроника и наноэлектроника,,290000,6edb3ca1-16c7-4a23-aa81-eff2b3e699a6,0.68,0,1,1,Московский государственный университет имени М.В. Ломоносова (МГУ),580000.0,,F,2,Кира Степановна Цветкова,0,BACHELOR,16,3.4,2024-07-10
2024-06-04,social_media,Прикладная математика,2024-07-16,350000,a9dbf8c0-1bd0-4527-a8cf-0ba5a9002c2,0.62,1,1,2,Национальный исследовательский университет «Высшая школа экономики» (ВШЭ),1050000.0,,M,4,Сорокин Спиридон Валентинович,1,BACHELOR,18,3.5,2024-05-03
2024-06-14,website,Автоматизация и управление,2024-09-04,210000,0c48e481-bb18-4885-8dd3-c2a294285356,0.71,1,1,2,Сибирский федеральный университет (СФУ),630000.0,,F,4,Голубева Фёкла Валериевна,0,MASTER,24,3.1,2024-05-13
2024-09-07,social_media,Физика,,265000,f642085f-8797-412b-bef8-4aed98a5f3e3,0.66,0,1,2,Московский физико-технический институт (МФТИ),954000.0,,M,4,Егор Власович Титов,0,MASTER,21,3.8,2024-07-16
2024-07-27,social_media,Химия,2024-09-14,270000,410f857d-35a6-4e6e-a53a-f3dbe85c628c,0.52,1,1,2,Российский государственный университет нефти и газа имени И.М. Губкина,1296000.0,,M,6,Сигизмунд Егорович Лазарев,0,BACHELOR,18,4.0,2024-05-19
2024-06-20,social_media,Физика,,315000,eaa2e064-e80e-41ff-8d59-47103a10a7d,0.59,0,1,2,Национальный исследовательский университет «Высшая школа экономики» (ВШЭ),945000.0,,F,4,Майя Федоровна Аксенова,1,MASTER,22,4.0,2024-05-02
2024-07-08,bank,Физика,2024-07-10,225000,fe6ffcdc-6750-4f80-939d-9c5e396ffef,0.54,1,1,2,Российский государственный университет нефти и газа имени И.М. Губкина,900000.0,,M,8,Панфилов Арефий Изотович,1,BACHELOR,16,4.0,2024-05-14
2024-05-20,bank,Прикладная математика,2024-08-25,240000,24519700-6b31-4735-8eac-9cfe4932438,0.73,1,1,2,Казанский федеральный университет (КФУ),768000.0,,F,4,Галина Петровна Боброва,1,MASTER,22,3.4,2024-05-01
2024-08-04,social_media,Автоматизация и управление,2024-08-17,420000,87b8a94d-7abb-4532-9008-95f9f53320e,0.53,1,1,3,Национальный исследовательский университет «Высшая школа экономики» (ВШЭ),2520000.0,,F,8,Пономарева Людмила Тимофеевна,1,BACHELOR,19,3.4,2024-07-17
2024-05-07,website,Электроника и наноэлектроника,2024-06-29,150000,b80e8c5f-91c5-4623-8dec-d1c68623cf08,0.64,1,1,2,Красноярский государственный университет (КГУ),720000.0,,F,8,Александра Захаровна Тетерина,0,BACHELOR,17,3.5,2024-05-05
2024-08-11,bank,Автоматизация и управление,2024-09-04,320000,6441a9f4-a80a-476a-8b8c-05a45b4e1c2f,0.6,1,1,2,Московский государственный университет имени М.В. Ломоносова (МГУ),960000.0,,F,6,Агафья Артемовна Герасимова,0,BACHELOR,17,3.8,2024-05-27
2024-06-08,social_media,Автоматизация и управление,2024-06-28,140000,687692f5-5919-4ebd-b7b0-560437b97d4c,0.54,1,1,3,Уральский федеральный университет имени первого Президента России Б.Н. Ельцина (УрФУ),756000.0,,F,6,Анисимова Алевтина Вадимовна,0,SPECIALTY,17,3.4,2024-06-03

Просмотри всю информацию, что ты получил, подумай и действуй как лучший специалист по ИИ, машинному обучению и анализу данных, чтобы помочь мне с задачей выше, и снизить MAE. Вот мой текущий код:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
from sklearn.preprocessing import PolynomialFeatures, LabelEncoder
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error

file_path = 'credit-data.csv'
data = pd.read_csv(file_path)

def preprocess_data(data):
    data = data.drop(['pid', 'marketing_flag', 'name'], axis=1)
    data['gender_cd'] = data['gender_cd'].replace({'M': 1, 'F': 0})
    data['was_rejected'] = data['reject_reason'].notna().astype(int)
    le = LabelEncoder()
    encoded_mapping = {}
    encoding_columns = ['specialty', 'education_level_code', 'reject_reason', 'utm_source', 'short_nm']
    for column in encoding_columns:
        data[column] = le.fit_transform(data[column])
        encoded_mapping[column] = dict(zip(le.classes_, le.transform(le.classes_)))

    for column, mapping in encoded_mapping.items():
        print(f"Column: {column}")
        for original, encoded in mapping.items():
            print(f"{original} -> {encoded}")
        print()  # Пустая строка для разделения между столбцами
    for date_column in ['approve_dttm', 'util_dttm', 'create_dttm']:
        data[date_column] = pd.to_datetime(data[date_column], errors='coerce')
        data[date_column] = (data[date_column] - data[date_column].min()).dt.days

    return data

data = preprocess_data(data)
print(data.head())
numeric_data = data.select_dtypes(include=[np.number])
correlations = numeric_data.corr()
print(correlations['score'].sort_values(ascending=False))

plt.figure(figsize=(24,16))
sns.heatmap(correlations, annot=True, cmap='RdYlGn')
plt.show()

significant_features = correlations['score'].abs().sort_values(ascending=False)
print("Самые важные переменные:", significant_features)

selected_features = ['approve_flg', 'util_flg', 'initial_approved_amt', 'age', 'semestr_cnt', 'gender_cd', 'initial_term', 'utm_source', 'education_level_code', 'short_nm', 'was_rejected']

# Подготовка данных для полиномиальной модели
X = numeric_data[selected_features].dropna()
y = numeric_data['score'][X.index]

# Разделяем данные на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Обучаем модель XGBoost
xgb_model = xgb.XGBRegressor(n_estimators=1000, learning_rate=0.05, max_depth=6)
xgb_model.fit(X_train, y_train)

# Предсказания
xgb_predictions = xgb_model.predict(X_test)

# Оцениваем MAE
xgb_mae = mean_absolute_error(y_test, xgb_predictions)
print(f"Mean Absolute Error (MAE) для XGBoost: {xgb_mae:.3f}")

# Преобразование признаков в полиномиальные для учета нелинейных зависимостей
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)

# Создание и обучение модели на полиномиальных признаках
model = LinearRegression()
model.fit(X_poly, y)

# Предсказание и оценка точности модели
predictions = model.predict(X_poly)
mae = mean_absolute_error(y, predictions)
print(f"Mean Absolute Error (MAE): {mae:.3f}")
# Выведите фактические и предсказанные значения для сравнения
comparison_df = pd.DataFrame({'Фактические': y_test, 'XGBoost Предсказанные': xgb_predictions})
print(comparison_df.head())
# График предсказаний XGBoost
plt.figure(figsize=(14, 6))

# Субграфик для XGBoost
plt.subplot(1, 2, 1)
plt.scatter(y_test, xgb_predictions, alpha=0.7)
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--')  # Линия идеального предсказания
plt.title('XGBoost: Предсказания vs Фактические значения')
plt.xlabel('Фактические значения')
plt.ylabel('Предсказанные значения')
plt.xlim(y.min(), y.max())
plt.ylim(y.min(), y.max())
plt.grid()

# График предсказаний линейной регрессии
plt.subplot(1, 2, 2)
plt.scatter(y, predictions, alpha=0.7)
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--')  # Линия идеального предсказания
plt.title('Линейная регрессия: Предсказания vs Фактические значения')
plt.xlabel('Фактические значения')
plt.ylabel('Предсказанные значения')
plt.xlim(y.min(), y.max())
plt.ylim(y.min(), y.max())
plt.grid()

plt.tight_layout()
plt.show()

# Показ формулы на основе коэффициентов модели
coeffs = model.coef_
intercept = model.intercept_
terms = poly.get_feature_names_out(selected_features)
formula = "score = " + f"{intercept:.2f} " + " + ".join([f"{coef:.2f}*{term}" for coef, term in zip(coeffs, terms)])
print("Обновленная формула для предсказания score:", formula)