Новая Школа - онлайн-школа подготовки к ЕГЭ
Задача Задача №3662776
А
Аноним
17 сентября 2026 04:36 · публичный вопрос
А
Аноним

```python import pandas as pd import numpy as np import lightgbm as lgb from sklearn.model_selection import KFold from sklearn.feature_extraction.text import TfidfVectorizer from…

Запрос пользователя

```python import pandas as pd import numpy as np import lightgbm as lgb from sklearn.model_selection import KFold from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import TruncatedSVD import warnings warnings.filterwarnings('ignore') train = pd.read_parquet('train.parquet') test = pd.read_parquet('test.parquet') sample_sub = pd.read_csv('sample_submission.csv') targets = ['real_weight', 'real_height', 'real_width', 'real_length'] def create_features(df): df = df.copy() df['title'] = df['title'].fillna('') df['description'] = df['description'].fillna('') df['text'] = df['title'] + ' ' + df['description'] df['text_len'] = df['text'].apply(len) df['word_count'] = df['text'].apply(lambda x: len(x.split())) cat_cols = ['category_name', 'subcategory_name', 'microcat_name', 'item_condition'] for col in cat_cols: df[col] = df[col].astype(str).fillna('unknown') df[col + '_freq'] = df[col].map(df[col].value_counts()) df['item_price'] = pd.to_numeric(df['item_price'], errors='coerce') df['log_price'] = np.log1p(df['item_price'].fillna(0)) df['order_date'] = pd.to_datetime(df['order_date'], errors='coerce') df['month'] = df['order_date'].dt.month df['dayofweek'] = df['order_date'].dt.dayofweek df['seller_id'] = df['seller_id'].astype(str) df['buyer_id'] = df['buyer_id'].astype(str) df['seller_freq'] = df['seller_id'].map(df['seller_id'].value_counts()) df['buyer_freq'] = df['buyer_id'].map(df['buyer_id'].value_counts()) df['price_per_word'] = df['item_price'] / (df['word_count'] + 1) return df train_fe = create_features(train) test_fe = create_features(test) tfidf = TfidfVectorizer(max_features=10000, ngram_range=(1, 2), min_df=3) tfidf.fit(pd.concat([train_fe['text'], test_fe['text']])) train_tfidf = tfidf.transform(train_fe['text']) test_tfidf = tfidf.transform(test_fe['text']) svd = TruncatedSVD(n_components=50, random_state=42) train_svd = svd.fit_transform(train_tfidf) test_svd = svd.transform(test_tfidf) svd_cols = [f'svd_{i}' for i in range(50)] train_fe = pd.concat([train_fe, pd.DataFrame(train_svd, columns=svd_cols, index=train_fe.index)], axis=1) test_fe = pd.concat([test_fe, pd.DataFrame(test_svd, columns=svd_cols, index=test_fe.index)], axis=1) for i in range(10): train_fe[f'img_feat_{i}'] = np.random.randn(len(train_fe)) test_fe[f'img_feat_{i}'] = np.random.randn(len(test_fe)) features = [ 'text_len', 'word_count', 'log_price', 'month', 'dayofweek', 'seller_freq', 'buyer_freq', 'price_per_word' ] + [c + '_freq' for c in ['category_name', 'subcategory_name', 'microcat_name', 'item_condition']] + svd_cols + [f'img_feat_{i}' for i in range(10)] X_train = train_fe[features].fillna(0) X_test = test_fe[features].fillna(0) test_preds = {t: np.zeros(len(X_test)) for t in targets} kf = KFold(n_splits=5, shuffle=True, random_state=42) for target in targets: y = train_fe[target].values for fold, (train_idx, val_idx) in enumerate(kf.split(X_train)): X_tr, X_val = X_train.iloc[train_idx], X_train.iloc[val_idx] y_tr, y_val = y[train_idx], y[val_idx] model = lgb.LGBMRegressor( n_estimators=2000, learning_rate=0.02, max_depth=7, num_leaves=31, subsample=0.8, colsample_bytree=0.8, random_state=42, n_jobs=-1, verbose=-1 ) model.fit(X_tr, y_tr, eval_set=[(X_val, y_val)], eval_metric='mae', callbacks=[lgb.early_stopping(100)]) test_preds[target] += model.predict(X_test) / 5 submission = sample_sub.copy() for target in targets: submission[target] = np.maximum(test_preds[target], 0) submission.to_csv('submission.csv', index=False) ``` сделай в виде файла

Ответ нейросети

Кратко: сохрани код ниже в файл solution.py. После запуска рядом с входными файлами появится submission.csv. Численный результат здесь проверить нельзя без train.parquet, test.parquet и sample_submission.csv.

Как работает программа

  1. Загружает обучающую и тестовую выборки.
  2. Создаёт числовые признаки из текста, цены, даты и категорий.
  3. Преобразует текст через TF-IDF и сокращает его до 50 признаков с помощью SVD.
  4. Для каждой из 4 целей обучает 5 моделей LightGBM.
  5. Усредняет предсказания и заменяет отрицательные значения на нули.
  6. Сохраняет результат в submission.csv.

Файл solution.py

import pandas as pd
import numpy as np
import lightgbm as lgb
from sklearn.model_selection import KFold
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
import warnings

warnings.filterwarnings('ignore')


# Загрузка данных
train = pd.read_parquet('train.parquet')
test = pd.read_parquet('test.parquet')
sample_sub = pd.read_csv('sample_submission.csv')

targets = [
    'real_weight',
    'real_height',
    'real_width',
    'real_length'
]


def create_features(df):
    df = df.copy()

    # Обработка текста
    df['title'] = df['title'].fillna('')
    df['description'] = df['description'].fillna('')
    df['text'] = df['title'] + ' ' + df['description']

    df['text_len'] = df['text'].apply(len)
    df['word_count'] = df['text'].apply(lambda x: len(x.split()))

    # Категориальные признаки и их частоты
    cat_cols = [
        'category_name',
        'subcategory_name',
        'microcat_name',
        'item_condition'
    ]

    for col in cat_cols:
        df[col] = df[col].astype(str).fillna('unknown')
        df[col + '_freq'] = df[col].map(df[col].value_counts())

    # Цена
    df['item_price'] = pd.to_numeric(
        df['item_price'],
        errors='coerce'
    )

    df['log_price'] = np.log1p(
        df['item_price'].fillna(0)
    )

    # Дата
    df['order_date'] = pd.to_datetime(
        df['order_date'],
        errors='coerce'
    )

    df['month'] = df['order_date'].dt.month
    df['dayofweek'] = df['order_date'].dt.dayofweek

    # Продавец и покупатель
    df['seller_id'] = df['seller_id'].astype(str)
    df['buyer_id'] = df['buyer_id'].astype(str)

    df['seller_freq'] = df['seller_id'].map(
        df['seller_id'].value_counts()
    )

    df['buyer_freq'] = df['buyer_id'].map(
        df['buyer_id'].value_counts()
    )

    # Цена на одно слово
    df['price_per_word'] = (
        df['item_price'] / (df['word_count'] + 1)
    )

    return df


# Создание признаков
train_fe = create_features(train)
test_fe = create_features(test)


# TF-IDF для текста
tfidf = TfidfVectorizer(
    max_features=10000,
    ngram_range=(1, 2),
    min_df=3
)

tfidf.fit(
    pd.concat([
        train_fe['text'],
        test_fe['text']
    ])
)

train_tfidf = tfidf.transform(train_fe['text'])
test_tfidf = tfidf.transform(test_fe['text'])


# Сокращение размерности текста
svd = TruncatedSVD(
    n_components=50,
    random_state=42
)

train_svd = svd.fit_transform(train_tfidf)
test_svd = svd.transform(test_tfidf)

svd_cols = [
    f'svd_{i}'
    for i in range(50)
]

train_fe = pd.concat(
    [
        train_fe,
        pd.DataFrame(
            train_svd,
            columns=svd_cols,
            index=train_fe.index
        )
    ],
    axis=1
)

test_fe = pd.concat(
    [
        test_fe,
        pd.DataFrame(
            test_svd,
            columns=svd_cols,
            index=test_fe.index
        )
    ],
    axis=1
)


# Временные случайные признаки изображений.
# Для настоящей задачи их желательно заменить
# реальными признаками изображений.
np.random.seed(42)

for i in range(10):
    train_fe[f'img_feat_{i}'] = np.random.randn(
        len(train_fe)
    )

    test_fe[f'img_feat_{i}'] = np.random.randn(
        len(test_fe)
    )


# Список признаков
features = [
    'text_len',
    'word_count',
    'log_price',
    'month',
    'dayofweek',
    'seller_freq',
    'buyer_freq',
    'price_per_word'
]

features += [
    c + '_freq'
    for c in [
        'category_name',
        'subcategory_name',
        'microcat_name',
        'item_condition'
    ]
]

features += svd_cols

features += [
    f'img_feat_{i}'
    for i in range(10)
]


X_train = train_fe[features].fillna(0)
X_test = test_fe[features].fillna(0)


# Подготовка предсказаний
test_preds = {
    target: np.zeros(len(X_test))
    for target in targets
}

kf = KFold(
    n_splits=5,
    shuffle=True,
    random_state=42
)


# Обучение отдельной модели для каждой цели
for target in targets:
    y = train_fe[target].values

    for fold, (train_idx, val_idx) in enumerate(
        kf.split(X_train),
        start=1
    ):
        X_tr = X_train.iloc[train_idx]
        X_val = X_train.iloc[val_idx]

        y_tr = y[train_idx]
        y_val = y[val_idx]

        model = lgb.LGBMRegressor(
            n_estimators=2000,
            learning_rate=0.02,
            max_depth=7,
            num_leaves=31,
            subsample=0.8,
            colsample_bytree=0.8,
            random_state=42,
            n_jobs=-1,
            verbose=-1
        )

        model.fit(
            X_tr,
            y_tr,
            eval_set=[(X_val, y_val)],
            eval_metric='mae',
            callbacks=[
                lgb.early_stopping(100)
            ]
        )

        test_preds[target] += (
            model.predict(X_test) / 5
        )


# Формирование итогового файла
submission = sample_sub.copy()

for target in targets:
    submission[target] = np.maximum(
        test_preds[target],
        0
    )


# Проверка результата
if len(submission) != len(test):
    raise ValueError(
        'Количество строк в submission.csv '
        'не совпадает с test.parquet'
    )

missing_targets = [
    target
    for target in targets
    if target not in submission.columns
]

if missing_targets:
    raise ValueError(
        f'В файле отсутствуют столбцы: {missing_targets}'
    )

if (submission[targets] < 0).any().any():
    raise ValueError(
        'В предсказаниях обнаружены отрицательные значения'
    )


submission.to_csv(
    'submission.csv',
    index=False
)

print(
    f'Готово. Файл submission.csv создан. '
    f'Количество строк: {len(submission)}'
)

Для запуска установи зависимости:

pip install pandas numpy lightgbm scikit-learn pyarrow

Затем выполни:

python solution.py

Важно: img_feat_0–img_feat_9 сейчас являются случайными числами, а не настоящими признаками изображений. Для качественного решения их нужно заменить реальными признаками или удалить.