Я создаю конвейер машинного обучения, используя scikit-learn и XGBoost для задачи регрессии. Мой текущий скрипт работает, но я чувствую, что архитектура немного запутана.
Сейчас я выполняю разработку собственных функций (умножая длину и дыхание, чтобы создать область) вручную, прежде чем данные когда-либо достигнут ColumnTransformer. У меня также есть несколько справочных фрагментов внизу для загрузки различных типов форматов данных, но они просто лежат без дела.
Вот текущий код:
import pandas as pd
from xgboost import XGBRegressor
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder, StandardScaler, TargetEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
train_data = pd.read_csv("train.csv")
y_train = train_data['target']
x_train = train_data.drop(columns=['id', 'target'])
test_data = pd.read_csv("test.csv")
x_test = test_data.drop(columns=['id'])
numeric_features = x_train.select_dtypes(include=['int64', 'float64']).columns.tolist()
categorical_features = x_train.select_dtypes(include=['category', 'object']).columns.tolist()
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scalar', StandardScaler())
])
#Use ('scalar', RobustScaler()) if dataset has skewed outliers
#import RobustScaler() from sklearn.preprocessing
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='Missing')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
#Use target encoder instead of onehot encoder if there are lots of unique values for a feature
#('target_encoder', TargetEncoder())
])
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
]
)
model_pipeline = Pipeline(steps=[
('preprocessor', preprocessor),
('regressor', XGBRegressor(n_estimators=100, max_depth=6, learning_rate=0.1, random_state=42, n_jobs=-1))
])
print("Training...")
model_pipeline.fit(x_train, y_train)
print("Making Predictions...")
test_preds = model_pipeline.predict(x_test)
submission = pd.DataFrame({
'id': test_data['id'],
'target': test_preds
})
submission.to_csv('submission.csv', index=False)
print("Success")
#ways to load data
train_data = pd.read_csv("train.tsv", sep='\t') #Tab-Separated Values
train_data = pd.read_parquet("train.parquet")
train_data = pd.read_json("train.json")
train_data = pd.read_csv("train.csv.zip")
train_data = pd.read_csv("train.csv.gz")
train_data = pd.read_pickle("train.pkl")
#ways to create a new feature
x_train['area'] = x_train['length'] * x_train['breath']
x_test['area'] = x_test['length'] * x_test['breath']
x_train = x_train.drop(columns=['length', 'breath'])
x_test = x_test.drop(columns=['length', 'breath'])
#ways to convert a target column
TARGET_COL = 'Heart Disease'
y_train = train_data[TARGET_COL].map({'Presence': 1, 'Absence': 0})
X_train = train_data.drop(columns=['id', TARGET_COL])
X_test = test_data.drop(columns=['id'])
#Ways to find no. of unique values in a feature
print(x_train['song_name'].nunique())
#Ways to install xgboost
python -m ensurepip --upgrade
python -m pip install xgboost
#Ways to install pandas and scikit-learn
pip install pandas scikit-learn
#Ways to check accuracy of the model
from sklearn.model_selection import cross_val_score
print("Running Cross Validation...")
scores = cross_val_score(
model_pipeline,
x_train,
y_train,
cv=5,
scoring='neg_mean_squared_error',
n_jobs=-1
)
rmse_scores = np.sqrt(-scores)
print(f"Average RMSE: {rmse_scores.mean():.4f} (+/- {rmse_scores.std():.4f})")
Вопросы:
Как лучше всего переместить расчет площади непосредственно внутри model_pipeline, чтобы мне не приходилось вручную применять его как к обучающему, так и к тестовому наборам? Должен ли я использовать FunctionTransformer или создать собственный класс?
Существует ли динамический способ структурировать сценарий, чтобы он мог автоматически определять и загружать правильный формат файла (CSV, Parquet, JSON и т. д.) на основе расширения без кучи свободных ссылочных переменных внизу?
Любой совет по очистке этого для лучшего повторного использования. будем очень признательны.
Я создаю конвейер машинного обучения, используя scikit-learn и XGBoost для задачи регрессии. Мой текущий скрипт работает, но я чувствую, что архитектура немного запутана. Сейчас я выполняю разработку собственных функций (умножая длину и дыхание, чтобы создать область) вручную, прежде чем данные когда-либо достигнут ColumnTransformer. У меня также есть несколько справочных фрагментов внизу для загрузки различных типов форматов данных, но они просто лежат без дела. Вот текущий код: [code]import pandas as pd from xgboost import XGBRegressor from sklearn.impute import SimpleImputer from sklearn.preprocessing import OneHotEncoder, StandardScaler, TargetEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline
numeric_transformer = Pipeline(steps=[ ('imputer', SimpleImputer(strategy='median')), ('scalar', StandardScaler()) ]) #Use ('scalar', RobustScaler()) if dataset has skewed outliers #import RobustScaler() from sklearn.preprocessing
categorical_transformer = Pipeline(steps=[ ('imputer', SimpleImputer(strategy='constant', fill_value='Missing')), ('onehot', OneHotEncoder(handle_unknown='ignore')) #Use target encoder instead of onehot encoder if there are lots of unique values for a feature #('target_encoder', TargetEncoder()) ])
print(f"Average RMSE: {rmse_scores.mean():.4f} (+/- {rmse_scores.std():.4f})") [/code] [b]Вопросы:[/b] [list] [*]Как лучше всего переместить расчет площади непосредственно внутри model_pipeline, чтобы мне не приходилось вручную применять его как к обучающему, так и к тестовому наборам? Должен ли я использовать FunctionTransformer или создать собственный класс?
[*]Существует ли динамический способ структурировать сценарий, чтобы он мог автоматически определять и загружать правильный формат файла (CSV, Parquet, JSON и т. д.) на основе расширения без кучи свободных ссылочных переменных внизу?
[/list] Любой совет по очистке этого для лучшего повторного использования. будем очень признательны.