Как я могу улучшить свою модель прогнозирования sklearn?

По сути, у меня есть модель в sklearn, которая предсказывает выживаемость Титаника. его точность составляет около 0,77.

Как я могу сделать это лучше и точнее?

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, LabelEncoder, MinMaxScaler
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.tree import DecisionTreeClassifier
train_df = pd.read_csv("train.csv")
test_df = pd.read_csv("test.csv")
le = LabelEncoder()
sc = StandardScaler()

train_df['Age'].fillna(train_df['Age'].mean(), inplace=True)
train_df["Embarked"].fillna("N", inplace=True)
train_df['Cabin'] = train_df['Cabin'].str[:1]
train_df['Cabin'].fillna('N', inplace=True)
train_df["Cabin"]
for col in ["Sex", "Embarked", "Cabin"]:
    train_df[col] = LabelEncoder().fit_transform(train_df[col])

x = train_df.drop(["PassengerId","Name","Ticket", "Survived"], axis=1)
y = train_df["Survived"]

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
dt_clf = DecisionTreeClassifier(max_depth= 5, min_samples_leaf= 1,min_samples_split= 2)
dt_clf.fit(x_train, y_train)
pred = dt_clf.predict(x_test)
print(metrics.accuracy_score(y_test, pred))

Я залил на среднее значение и поменял масштабатор и алгоритм, но ничего не произошло.

Вы можете включить братьев и сестер/супругов из набора данных в свое обучение.

Kokodoko 30.06.2024 10:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Особенности проектирования: Вы можете создать некоторые новые функции. Например:

  • Размер семьи: Объедините столбцы «sibsp» (количество братьев и сестер/супругов на борту) и «parch» (количество родителей/детей на борту), чтобы создать новый признак, отражающий размер семьи.
  • Название: извлекайте названия из имен пассажиров (например, «Мистер», «Миссис», «Мисс») и используйте их как функцию.
  • IsAlone: ​​создайте двоичный объект, указывающий, путешествовал ли пассажир один.

Масштабирование и кодирование: В настоящее время вы используете LabelEncoder для категориальных переменных. Рассмотрите возможность использования OneHotEncoder или pd.get_dummies для лучшей обработки категориальных переменных. Кроме того, обязательно применяйте соответствующие методы масштабирования.

Выбор функции: Вы должны выбрать наиболее важные функции. Вы можете использовать такие методы, как рекурсивное исключение функций (RFE), важность функций из моделей или корреляционные матрицы, чтобы исключить менее важные функции.

Выбор модели и настройка гиперпараметров: Вы используете DecisionTreeClassifier. Возможно, вы можете попробовать разные алгоритмы и использовать перекрестную проверку для точной настройки гиперпараметров. Это поможет вам подобрать оптимальное сочетание для вашей модели.

Перекрестная проверка и настройка гиперпараметров: Чтобы найти лучшие гиперпараметры для вашей модели, рассмотрите возможность использования GridSearchCV или RandomizedSearchCV.

Посмотрите на мой восстановленный код:

import seaborn as sns
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score

# Load Titanic dataset from Seaborn
titanic = sns.load_dataset('titanic')
print("Dataset loaded.")

# Feature engineering
titanic['FamilySize'] = titanic['sibsp'] + titanic['parch']
titanic['IsAlone'] = (titanic['FamilySize'] == 0).astype(int)
titanic['deck'] = titanic['deck'].cat.add_categories('N').fillna('N')
print("Feature engineering completed.")

# Dropping features
dropped_features = ['alive', 'adult_male', 'embark_town', 'alone']
titanic.drop(dropped_features, axis=1, inplace=True)
print(f"Dropped less useful features: {dropped_features}")

# Preprocessing
numeric_features = ['age', 'fare', 'FamilySize']
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='mean')),
    ('scaler', StandardScaler())])

categorical_features = ['sex', 'deck', 'embarked', 'who', 'class']
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))])

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)])
print("Preprocessing setup completed.")

# Splitting data
X = titanic.drop('survived', axis=1)
y = titanic['survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("Data split into training and testing sets.")

# Define models and their hyperparameters
models = {
    'RandomForest': {
        'model': RandomForestClassifier(random_state=42),
        'params': {
            'classifier__n_estimators': [100, 200],
            'classifier__max_depth': [5, 10],
            'classifier__min_samples_split': [2, 5],
            'classifier__min_samples_leaf': [1, 2]
        }
    },
    'LogisticRegression': {
        'model': LogisticRegression(max_iter=1000),
        'params': {
            'classifier__C': [0.01, 0.1, 1, 10],
            'classifier__solver': ['lbfgs', 'liblinear']
        }
    },
    'SVM': {
        'model': SVC(),
        'params': {
            'classifier__C': [0.1, 1, 10],
            'classifier__gamma': ['scale', 'auto'],
            'classifier__kernel': ['linear', 'rbf']
        }
    },
    'GradientBoosting': {
        'model': GradientBoostingClassifier(random_state=42),
        'params': {
            'classifier__n_estimators': [100, 200],
            'classifier__learning_rate': [0.01, 0.1],
            'classifier__max_depth': [3, 5]
        }
    },
    'XGBoost': {
        'model': XGBClassifier(random_state=42),
        'params': {
            'classifier__n_estimators': [100, 200],
            'classifier__learning_rate': [0.01, 0.1],
            'classifier__max_depth': [3, 5]
        }
    }
}

# Function to perform grid search and return the best model
def perform_grid_search(X_train, y_train, model, params):
    pipeline = Pipeline(steps=[('preprocessor', preprocessor),
                               ('classifier', model)])
    grid_search = GridSearchCV(pipeline, params, cv=5, scoring='accuracy')
    grid_search.fit(X_train, y_train)
    return grid_search

best_models = {}
for model_name, model_info in models.items():
    print(f"Training {model_name}...")
    best_models[model_name] = perform_grid_search(X_train, y_train, model_info['model'], model_info['params'])
    print(f"{model_name} training completed.")

# Evaluate models
for model_name, model in best_models.items():
    best_model = model.best_estimator_
    y_pred = best_model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    print(f'{model_name} Best Hyperparameters: {model.best_params_}')
    print(f'{model_name} Accuracy: {accuracy}')

# Select the best model based on accuracy
best_model_name = max(best_models, key=lambda name: accuracy_score(y_test, best_models[name].best_estimator_.predict(X_test)))
print(f'Best model: {best_model_name} with accuracy {accuracy_score(y_test, best_models[best_model_name].best_estimator_.predict(X_test))}')

Моя точность около 0,821.

Другие вопросы по теме