Data · no login required

The Datasets

Eight datasets carry the course. Each one loads with the snippet below in any Colab notebook, and each comes with the trap that catches first-time modelers.

Telco Customer Churn

7,043 customers × 21 columns · 26.5% churn
classification S1S2S3S6S12S13

The course's home dataset. Clean enough to model in twelve lines, rich enough for feature engineering, and the one we use to turn scores into a retention decision.

Gotcha: TotalCharges is read as text — 11 blank strings for brand-new customers. Coerce with pd.to_numeric(errors='coerce').

python
URL = 'https://raw.githubusercontent.com/harslan/isom-835/master/public/data/telco_churn.csv'
df = pd.read_csv(URL)
df['TotalCharges'] = pd.to_numeric(df['TotalCharges'], errors='coerce')
y = (df['Churn'] == 'Yes').astype(int)

Hotel Booking Demand

83,573 bookings × 32 columns · 37% canceled (the competition training rows; 35,817 test rows are held out on Kaggle)
classification · competition S7S8S9

The midterm competition dataset and the tree/boosting workhorse. Big enough that early stopping and GroupKFold matter.

Gotcha: reservation_status and reservation_status_date ARE the outcome. assigned_room_type is known only at check-in. Drop all three.

python
URL = 'https://raw.githubusercontent.com/harslan/isom-835/master/public/data/hotel_bookings.csv'
df = pd.read_csv(URL)
LEAKS = ['reservation_status', 'reservation_status_date', 'assigned_room_type']
X, y = df.drop(columns=['is_canceled'] + LEAKS), df['is_canceled']

Ames Housing (Kaggle House Prices)

1,460 sales × 79 features · median $163K
regression S4S9

The regression classic: skewed target, mixed types, many categoricals. Ridge and lasso shine; a permanent Kaggle leaderboard to check yourself against.

Gotcha: Model log1p(price) and expm1 the predictions before reporting errors in dollars.

python
from sklearn.datasets import fetch_openml
ames = fetch_openml('house_prices', as_frame=True)
X, y = ames.data.drop(columns=['Id']), ames.target

Default of Credit Card Clients (Taiwan)

30,000 clients × 23 features · 22.1% default
classification S5S6

Credit risk with a real base rate and a cost matrix that makes the threshold discussion concrete. Payment-status codes reward feature engineering.

Gotcha: OpenML column names are x1…x23; map them to the UCI documentation. Payment status columns work better as categories than as numbers.

python
from sklearn.datasets import fetch_openml
credit = fetch_openml(data_id=42477, as_frame=True)
X, y = credit.data, (credit.target == '1').astype(int)

Bank Marketing (Portuguese bank)

45,211 calls × 16 features · 11.7% subscribed
classification S3S7

Ten categorical columns make it the encoder playground — and it contains the most famous leak in tabular ML.

Gotcha: duration (V12) is call length, known only after the call. Drop it, or your model is a fortune-teller.

python
from sklearn.datasets import fetch_openml
bank = fetch_openml('bank-marketing', version=1, as_frame=True)
X = bank.data.drop(columns=['V12'])            # V12 = duration: leakage
y = (bank.target == '2').astype(int)

Online Retail II

1,067,371 transactions · ~5,900 customers · 2009–2011
unsupervised · RFM S10

A million real transactions collapse into RFM profiles — the segmentation dataset.

Gotcha: Invoices starting with C are cancellations; drop them and rows without a Customer ID. The zip contains one xlsx with two sheets.

python
import io, zipfile, urllib.request
z = zipfile.ZipFile(io.BytesIO(urllib.request.urlopen('https://archive.ics.uci.edu/static/public/502/online+retail+ii.zip').read()))
sheets = pd.read_excel(io.BytesIO(z.read([n for n in z.namelist() if n.endswith('.xlsx')][0])), sheet_name=None)
tx = pd.concat(sheets.values(), ignore_index=True)

Bike Sharing (Capital Bikeshare, hourly)

17,379 hours · 2011–2012 · weather + calendar
forecasting S11

Strong daily and weekly seasonality, weather covariates, holidays — everything a forecasting lesson needs.

Gotcha: Some hours are missing; call asfreq('h') and interpolate before building lags. Never split randomly.

python
import io, zipfile, urllib.request
z = zipfile.ZipFile(io.BytesIO(urllib.request.urlopen('https://archive.ics.uci.edu/static/public/275/bike+sharing+dataset.zip').read()))
bike = pd.read_csv(io.BytesIO(z.read('hour.csv')))

Amazon Polarity (reviews)

3.6M reviews · we use 5,000
text classification S12

Text as features three ways: TF-IDF, sentence embeddings, zero-shot LLM labels.

Gotcha: Needs the datasets library (pip install datasets). Fallback in the notebook: sklearn's 20 newsgroups.

python
from datasets import load_dataset
ds = load_dataset('fancyzhx/amazon_polarity', split='train[:5000]')
texts, labels = ds['content'], ds['label']
02 // FOR YOUR PROJECT

Eight more that work well

Public, well documented, and business-shaped. Frame the decision first — a Kaggle metric is not a deliverable.