Scikit-Learn: Machine Learning for Beginners

Published on: July 10, 2026
Reading time: 7 minutes
representação de IA com código binário na tela

Scikit-Learn is one of the most accessible libraries for learning practical machine learning in Python. It provides a consistent interface for preparing data, training models, making predictions, measuring performance, selecting features, and tuning parameters.

This Scikit-Learn for beginners guide builds a complete workflow. You will learn the difference between features and targets, split data correctly, train classification and regression models, interpret metrics, use pipelines, and avoid mistakes such as data leakage.

What Is Machine Learning?

Traditional programs follow rules written directly by a developer. A machine-learning model learns patterns from examples. Given historical data, it estimates a relationship that can be applied to new data.

  • Classification: predict a category, such as spam or not spam.
  • Regression: predict a numerical value, such as price or demand.
  • Clustering: group similar observations without known labels.
  • Dimensionality reduction: represent data with fewer variables.

Scikit-Learn focuses mainly on classical machine-learning workflows. The official Scikit-Learn user guide and official getting-started guide are the primary references.

Install Scikit-Learn

Create an isolated environment and install the library:

python -m venv .venv
source .venv/bin/activate  # macOS/Linux
# .venv\Scripts\activate   # Windows
python -m pip install scikit-learn pandas matplotlib

The Python virtual environment guide explains activation and dependency management. Scikit-Learn works closely with NumPy arrays and Pandas DataFrames, so the guides to NumPy and Pandas are useful companions.

Features, Target, Samples, and Models

Each row is a sample. Input columns are features, usually stored in a matrix called X. The value to predict is the target, usually stored in y.

import pandas as pd

data = pd.DataFrame({
    "hours_studied": [1, 2, 3, 4, 5, 6, 7, 8],
    "practice_tests": [0, 1, 1, 2, 2, 3, 4, 5],
    "passed": [0, 0, 0, 1, 1, 1, 1, 1],
})

X = data[["hours_studied", "practice_tests"]]
y = data["passed"]

The model learns from X and y. It should later predict y for rows it did not see during training.

Split Training and Test Data

Evaluating a model on the same rows used for training can produce an unrealistically high score. Reserve a test set.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.25,
    random_state=42,
    stratify=y,
)

random_state makes the split reproducible. stratify=y helps preserve class proportions in classification, when the dataset is large enough to support it.

Train a Classification Model

Logistic regression is a strong baseline for binary classification.

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(X_train, y_train)

predictions = model.predict(X_test)
probabilities = model.predict_proba(X_test)[:, 1]

Scikit-Learn estimators use a consistent pattern:

  1. Create the estimator.
  2. Call fit() with training data.
  3. Call predict() or another prediction method on new data.

Evaluate Classification

from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

print("Accuracy:", accuracy_score(y_test, predictions))
print(confusion_matrix(y_test, predictions))
print(classification_report(y_test, predictions))

Accuracy is the proportion of correct predictions, but it can be misleading when one class is much more common than another.

  • Precision: among predicted positives, how many were correct?
  • Recall: among actual positives, how many were found?
  • F1-score: balance between precision and recall.
  • Confusion matrix: counts correct and incorrect predictions by class.

The right metric depends on the cost of each error. Missing fraud may be worse than investigating a false alarm; in another application, unnecessary interventions may be the larger problem.

Train a Regression Model

Regression predicts a continuous number. This example estimates a price from size and age.

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

X = data[["size", "age"]]
y = data["price"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

regressor = LinearRegression()
regressor.fit(X_train, y_train)

predictions = regressor.predict(X_test)

print("MAE:", mean_absolute_error(y_test, predictions))
print("MSE:", mean_squared_error(y_test, predictions))
print("R²:", r2_score(y_test, predictions))

Mean absolute error is easy to interpret because it uses the target’s original unit. Mean squared error penalizes large mistakes more strongly. R² measures how much variance the model explains relative to a simple baseline, but it should not be interpreted alone.

Preprocess Numeric Features

Some algorithms are sensitive to feature scales. A column measured in thousands can dominate another measured between zero and one. Standardization centers each training feature and scales it by its standard deviation.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

Notice that the scaler is fitted only on training data. Fitting it on the complete dataset leaks information from the test set.

Encode Categorical Features

Models generally need numerical inputs. One-hot encoding creates indicator columns for categories.

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler

numeric_features = ["age", "income"]
categorical_features = ["city", "plan"]

preprocessor = ColumnTransformer(
    transformers=[
        ("numeric", StandardScaler(), numeric_features),
        (
            "categorical",
            OneHotEncoder(handle_unknown="ignore"),
            categorical_features,
        ),
    ]
)

handle_unknown="ignore" prevents a failure when a future row contains a category absent from training, though the business meaning of new categories should still be reviewed.

Use a Pipeline

A pipeline combines preprocessing and the estimator. This prevents accidental differences between training and prediction.

from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression

pipeline = Pipeline([
    ("preprocess", preprocessor),
    ("model", LogisticRegression(max_iter=1000)),
])

pipeline.fit(X_train, y_train)
predictions = pipeline.predict(X_test)

The same pipeline can predict raw future rows because it applies the learned preprocessing automatically. Pipelines are one of the best defenses against data leakage and inconsistent production code.

Handle Missing Values

Many estimators do not accept missing values directly. Use an imputer inside the preprocessing workflow.

from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline

numeric_pipeline = Pipeline([
    ("imputer", SimpleImputer(strategy="median")),
    ("scaler", StandardScaler()),
])

categorical_pipeline = Pipeline([
    ("imputer", SimpleImputer(strategy="most_frequent")),
    ("encoder", OneHotEncoder(handle_unknown="ignore")),
])

Missingness may itself contain information. Understand why data is absent before choosing a strategy.

Cross-Validation

A single train-test split can produce a score that depends heavily on which rows were selected. Cross-validation repeats training and validation across several folds.

from sklearn.model_selection import cross_val_score

scores = cross_val_score(
    pipeline,
    X,
    y,
    cv=5,
    scoring="f1",
)

print("Fold scores:", scores)
print("Mean F1:", scores.mean())

Keep a final untouched test set for the last unbiased evaluation when model selection is extensive.

Tune Hyperparameters

Hyperparameters control the learning process and are selected before fitting. Grid search evaluates specified combinations through cross-validation.

from sklearn.model_selection import GridSearchCV

parameter_grid = {
    "model__C": [0.1, 1.0, 10.0],
    "model__class_weight": [None, "balanced"],
}

search = GridSearchCV(
    pipeline,
    parameter_grid,
    cv=5,
    scoring="f1",
    n_jobs=-1,
)

search.fit(X_train, y_train)

print(search.best_params_)
print(search.best_score_)

Do not tune endlessly on a small dataset. Model complexity cannot replace representative, high-quality data.

Decision Trees and Random Forests

Tree-based models capture nonlinear relationships and feature interactions.

from sklearn.ensemble import RandomForestClassifier

forest = RandomForestClassifier(
    n_estimators=300,
    max_depth=8,
    random_state=42,
    class_weight="balanced",
)

forest.fit(X_train, y_train)
predictions = forest.predict(X_test)

Random forests usually require less scaling than linear models, but they still need correct splitting, encoding, metrics, and leakage prevention.

Save and Load a Model

import joblib

joblib.dump(pipeline, "customer_model.joblib")
loaded_model = joblib.load("customer_model.joblib")

new_predictions = loaded_model.predict(new_customers)

Only load model files from trusted sources. Serialized Python objects can execute code during loading. Record package versions and the data schema alongside the artifact.

Data Leakage

Leakage occurs when training uses information unavailable at prediction time or information from the evaluation set. It creates excellent offline scores and poor real-world performance.

Common examples include:

  • Scaling or imputing before the train-test split.
  • Using a field created after the event being predicted.
  • Including duplicate people or transactions in both train and test sets.
  • Selecting features with the full dataset before validation.
  • Randomly splitting time-series data when future rows influence earlier predictions.

Fit all learned preprocessing inside a pipeline and design splits that reflect the real prediction scenario.

Overfitting and Underfitting

An underfit model is too simple and performs poorly on both training and validation data. An overfit model memorizes training details and performs much worse on unseen data.

Compare training and validation scores, reduce unnecessary complexity, collect more representative data, regularize models, and use cross-validation. Always inspect errors rather than relying on a single aggregate score.

A Complete Classification Example

import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler

customers = pd.read_csv("customers.csv")

X = customers.drop(columns="churned")
y = customers["churned"]

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42,
    stratify=y,
)

numeric = ["age", "monthly_spend", "months_active"]
categorical = ["plan", "region"]

numeric_pipeline = Pipeline([
    ("imputer", SimpleImputer(strategy="median")),
    ("scaler", StandardScaler()),
])

categorical_pipeline = Pipeline([
    ("imputer", SimpleImputer(strategy="most_frequent")),
    ("encoder", OneHotEncoder(handle_unknown="ignore")),
])

preprocessor = ColumnTransformer([
    ("numeric", numeric_pipeline, numeric),
    ("categorical", categorical_pipeline, categorical),
])

model = Pipeline([
    ("preprocess", preprocessor),
    ("classifier", LogisticRegression(max_iter=1000, class_weight="balanced")),
])

model.fit(X_train, y_train)
predictions = model.predict(X_test)

print(classification_report(y_test, predictions))

This pattern is reusable: load data, define X and y, split, build preprocessing, create a pipeline, fit, and evaluate.

Visualize Results

Charts can reveal patterns hidden by a single score. Plot residuals for regression, confusion matrices for classification, and class distributions before training. The Matplotlib beginner guide introduces chart creation.

Common Beginner Mistakes

  • Using the test set repeatedly while selecting the model.
  • Dropping rows with missing values without investigating the cause.
  • Reporting accuracy on highly imbalanced classes.
  • Using identifiers such as customer ID as meaningful numeric features.
  • Ignoring duplicates and target leakage.
  • Training before establishing a simple baseline.
  • Saving only the estimator and forgetting preprocessing.
  • Assuming correlation or prediction proves causation.

Frequently Asked Questions

Is Scikit-Learn suitable for beginners?

Yes. Its consistent API and extensive documentation make it an excellent starting point for classical machine learning.

Do I need advanced mathematics?

You can begin with basic statistics and algebra, but deeper knowledge helps you understand assumptions, metrics, and model behavior.

Why use a pipeline?

It keeps preprocessing and modeling together, reduces leakage, supports cross-validation, and ensures future data is transformed consistently.

Which model should I try first?

Use a simple baseline such as logistic regression for classification or linear regression for regression, then compare it with a tree-based model.

Can I deploy a Scikit-Learn model?

Yes, but deployment also requires input validation, compatible package versions, monitoring, security, and a plan for retraining.

Conclusion

A good Scikit-Learn workflow is more important than choosing a fashionable algorithm. Define the target clearly, create a realistic split, fit preprocessing only on training data, use pipelines, select meaningful metrics, compare baselines, analyze errors, and preserve the complete transformation-and-model pipeline. These habits produce results that are easier to trust and maintain.

Share:

Facebook
WhatsApp
Twitter
LinkedIn

Article content

    Related articles

    logos do Python, Pandas e NumPy numa mesa de madeira
    Data Science
    Foto de perfil de Leandro Hirt da Academify

    Python Data Analysis with Pandas and NumPy

    Learn Python data analysis with NumPy and Pandas: arrays, DataFrames, cleaning, filtering, summaries, grouping, missing data, and a complete workflow.

    Ler mais

    Tempo de leitura: 4 minutos
    10/07/2026
    Logo do matplotlib em um fundo branco
    Data Science
    Foto de perfil de Leandro Hirt da Academify

    Matplotlib in Python: Beginner Chart Guide

    Learn Matplotlib in Python from installation to line, bar, scatter and pie charts, labels, legends, subplots, Pandas integration, and image

    Ler mais

    Tempo de leitura: 5 minutos
    10/07/2026
    Visualização de dados com Plotly em Python
    Data Science
    Foto de perfil de Leandro Hirt da Academify

    Plotly in Python: Interactive Charts Guide

    Learn Plotly in Python from installation to interactive line, bar and scatter charts, styling, Pandas integration, export, and practical visualization

    Ler mais

    Tempo de leitura: 5 minutos
    10/07/2026
    Mesa de trabalho com laptop exibindo gráficos e a logo do Pandas em primeiro plano
    Data Science
    Foto de perfil de Leandro Hirt da Academify

    Pandas in Python: Complete Beginner Guide

    Learn Pandas in Python from scratch: Series, DataFrames, CSV and Excel import, selection, filtering, missing values, grouping, merging, export, and

    Ler mais

    Tempo de leitura: 5 minutos
    10/07/2026
    Geração e edição de planilhas Excel usando Python
    Data Science
    Foto de perfil de Leandro Hirt da Academify

    Generate and Edit Excel Files with Python

    Learn how to generate and edit Excel files with Python using Pandas and Openpyxl: create spreadsheets, read data, add formulas,

    Ler mais

    Tempo de leitura: 4 minutos
    03/06/2026
    Limpeza de dados sujos em Python para data cleaning
    Data Science
    Foto de perfil de Leandro Hirt da Academify

    Clean Messy Data in Python: Practical Guide

    Learn how to clean messy data in Python with Pandas, missing values, duplicates, type conversion, text cleanup, outliers, and reusable

    Ler mais

    Tempo de leitura: 9 minutos
    19/05/2026