ColumnTransformer Pipeline-putkiston sisällä
Oppijat sijoittavat numeerisen ja kategorisen datan yhdistetyn esikäsittelyn ColumnTransformerin avulla Pipelineen, jotta heterogeeninen raakadata voidaan käsitellä suoraan ilman manuaalista jakamista.
ColumnTransformer Pipeline-putkiston sisällä on ilmainen Machine Learning Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Machine Learning Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.
Tyypeiltään vaihtelevan datan ongelma
Reaalimaailman taulukkomuotoiset aineistot sisältävät lähes aina sekä numeerisia sarakkeita (ikä, palkka, lämpötila) että kategorisia sarakkeita (kaupunki, tuoteryhmä, sukupuoli). Kumpikin tyyppi tarvitsee erilaisen esikäsittelyn: numeeriset sarakkeet skaalausta tai puuttuvien arvojen imputointia, kun taas kategoriset sarakkeet koodausta. ColumnTransformer mahdollistaa eri muuntimien käyttämisen rinnakkain eri sarakejoukoille ja tuottaa yhden yhtenäisen piirrematriisin.
ColumnTransformer: perusrakenne
ColumnTransformer ottaa vastaan luettelon (name, transformer, columns)-kolmikoita. columns voi olla luettelo sarakenimistä, luettelo kokonaislukuna ilmaistuista indekseistä, totuusarvomaski tai sklearn-valitsin, kuten make_column_selector. Muunnoksen jälkeen kaikkien muuntimien tulokset yhdistetään vaakasuunnassa.
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
ct = ColumnTransformer([
('num', StandardScaler(), ['age', 'salary']),
('cat', OneHotEncoder(handle_unknown='ignore'), ['city', 'education'])
])
print('Transformers:', [name for name, _, _ in ct.transformers])Työskentely todellisen, tyypeiltään vaihtelevan aineiston kanssa
Luodaan pieni tyypeiltään vaihteleva DataFrame ja käytetään siihen ColumnTransformeria, jotta näemme tuloksen muodon ja arvot. Tämä havainnollistaa, miten numeeriset ja kategoriset tulokset yhdistetään yhdeksi NumPy-taulukoksi, jota mikä tahansa sklearn-estimaattori voi käsitellä.
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
df = pd.DataFrame({
'age': [25, 40, 35, 55],
'salary': [50000, 80000, 65000, 90000],
'city': ['NYC', 'LA', 'NYC', 'SF'],
'education': ['BSc', 'MSc', 'BSc', 'PhD']
})
ct = ColumnTransformer([
('num', StandardScaler(), ['age', 'salary']),
('cat', OneHotEncoder(handle_unknown='ignore', sparse_output=False), ['city', 'education'])
])
X_transformed = ct.fit_transform(df)
print('Output shape:', X_transformed.shape)
print('Output:\n', X_transformed.round(2))Sarakkeiden automaattinen valinta
Sarakkeiden manuaalisen luettelemisen sijaan voit valita ne automaattisesti tietotyypin perusteella käyttämällä make_column_selector-funktiota. dtype_include=np.number valitsee kaikki numeeriset sarakkeet; dtype_exclude=np.number valitsee ei-numeeriset sarakkeet (kategoriset tai merkkijonot). Tämä on erityisen hyödyllistä leveillä aineistoilla, joissa jokaisen sarakenimen luetteleminen olisi epäkäytännöllistä.
import numpy as np
import pandas as pd
from sklearn.compose import ColumnTransformer, make_column_selector
from sklearn.preprocessing import StandardScaler, OneHotEncoder
df = pd.DataFrame({
'age': [25, 40, 35], 'salary': [50000, 80000, 65000],
'city': ['NYC', 'LA', 'NYC']
})
ct = ColumnTransformer([
('num', StandardScaler(), make_column_selector(dtype_include=np.number)),
('cat', OneHotEncoder(), make_column_selector(dtype_exclude=np.number))
])
print(ct.fit_transform(df).shape)ColumnTransformerin sijoittaminen Pipelineen
ColumnTransformerin todellinen hyöty tulee esiin, kun se sijoitetaan Pipelineen esikäsittelyvaiheeksi. Koko Pipeline – esikäsittely ja luokitin – muodostaa yhden estimaattorin. Kaikki sklearnin työkalut (cross_val_score, GridSearchCV, joblib-sarjallistaminen) toimivat tämän yhdistetyn olion kanssa.
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer, make_column_selector
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
import numpy as np
preprocessor = ColumnTransformer([
('num', StandardScaler(), make_column_selector(dtype_include=np.number)),
('cat', OneHotEncoder(handle_unknown='ignore'),
make_column_selector(dtype_exclude=np.number))
])
pipe = Pipeline([
('preprocessor', preprocessor),
('clf', LogisticRegression(max_iter=300))
])
print('Pipeline steps:', [name for name, _ in pipe.steps])Päästä päähän -esimerkki Titanic-datalla
Sovelletaan ColumnTransformer-Pipelinea Titanic-tyyppiseen aineistoon. Numeerisille sarakkeille (Age, Fare) tehdään ensin mediaani-imputointi ja sen jälkeen standardointi; kategorisille sarakkeille (Sex, Embarked) tehdään yleisimmän arvon imputointi ja sen jälkeen one-hot-koodaus. Lopuksi Pipeline sovitetaan ja sen suorituskyky pisteytetään.
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
import numpy as np
# Simulated Titanic subset
df = pd.DataFrame({
'Age': [22, 38, None, 35, 28],
'Fare': [7.25, 71.83, 7.92, 53.1, 8.05],
'Sex': ['male', 'female', 'female', 'male', 'male'],
'Embarked': ['S', 'C', 'S', None, 'S'],
'Survived': [0, 1, 1, 1, 0]
})
X = df.drop('Survived', axis=1)
y = df['Survived']
num_pipe = Pipeline([('impute', SimpleImputer(strategy='median')),
('scale', StandardScaler())])
cat_pipe = Pipeline([('impute', SimpleImputer(strategy='most_frequent')),
('encode', OneHotEncoder(handle_unknown='ignore'))])
preprocessor = ColumnTransformer([
('num', num_pipe, ['Age', 'Fare']),
('cat', cat_pipe, ['Sex', 'Embarked'])
])
pipe = Pipeline([('prep', preprocessor), ('clf', LogisticRegression())])
pipe.fit(X, y)
print('Fitted successfully. Output features:', pipe['prep'].transform(X).shape[1])remainder-parametri
Oletusarvoisesti ColumnTransformer poistaa sarakkeet, joita ei ole erikseen lueteltu. Aseta remainder='passthrough', jos haluat välittää kaikki luettelemattomat sarakkeet muuttamattomina, tai remainder=StandardScaler(), jos haluat käyttää niihin muunninta. Tämä on hyödyllistä, kun numeerisia sarakkeita on paljon ja haluat käsitellä erityisesti vain muutamia kategorisia sarakkeita.
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
df = pd.DataFrame({
'age': [25, 40, 35],
'salary': [50000, 80000, 65000],
'city': ['NYC', 'LA', 'NYC']
})
# Only encode city; pass through numeric columns
ct = ColumnTransformer([
('cat', OneHotEncoder(), ['city'])
], remainder='passthrough')
print(ct.fit_transform(df))Muunnoksen jälkeisten piirrenimien hakeminen
Kun sovitus on tehty, hae kaikkien tulossarakkeiden nimet kutsumalla columntransformer.get_feature_names_out(). OneHotEncoder tuottaa esimerkiksi nimiä kuten cat__city_NYC, ja StandardScaler nimiä kuten num__age. Nämä nimet ovat olennaisia, kun tulkitset muunnetuilla tiedoilla opetettujen puumallien piirteiden tärkeyksiä.
import pandas as pd
import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
df = pd.DataFrame({
'age': [25, 40, 35],
'salary': [50000, 80000, 65000],
'city': ['NYC', 'LA', 'NYC']
})
ct = ColumnTransformer([
('num', StandardScaler(), ['age', 'salary']),
('cat', OneHotEncoder(sparse_output=False), ['city'])
])
ct.fit(df)
print('Output feature names:')
print(ct.get_feature_names_out())Grid-haun tekeminen ColumnTransformeria käyttävälle putkelle
Kun haluat säätää Pipelineen sisäkkäin sijoitetun ColumnTransformerin vaiheiden parametreja, käytä kaksoisalaviivaketjua: preprocessor__num__scale__with_std tai preprocessor__cat__encode__drop. Nimeämiskäytäntö on pipeline_step__ct_step__substep__param. Merkintä näyttää pitkältä, mutta se on täysin johdonmukainen.
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
# (assuming preprocessor and pipe are defined as above)
param_grid = {
'clf__C': [0.1, 1.0, 10.0],
# 'prep__num__scale__with_std': [True, False]
}
grid = GridSearchCV(pipe, param_grid, cv=3)
# grid.fit(X, y) # would run on real data
print('Grid ready with params:', list(param_grid.keys()))ColumnTransformer imputointialivaiheilla
Voit sijoittaa kullekin saraketyypille oman alitason Pipeline-putken ColumnTransformerin sisään, jolloin voit käsitellä useita peräkkäisiä toimintoja. Numeeristen tietojen alitason putki täyttää puuttuvat arvot ja skaalaa tiedot; kategoristen tietojen alitason putki täyttää puuttuvat arvot (jotta puuttuvat merkkijonot voidaan käsitellä) ja koodaa sitten arvot. Tämä rakenne pitää kaiken esikäsittelylogiikan yhdessä tarkastettavassa objektissa.
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
num_subpipe = Pipeline([
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])
cat_subpipe = Pipeline([
('imputer', SimpleImputer(strategy='most_frequent')),
('encoder', OneHotEncoder(handle_unknown='ignore', sparse_output=False))
])
print('Numeric sub-pipeline steps:', [s[0] for s in num_subpipe.steps])
print('Categorical sub-pipeline steps:', [s[0] for s in cat_subpipe.steps])Koko putken validointi
Kun olet rakentanut monimutkaisen putken, tee nopea järkevyystarkistus: sovita se pieneen synteettiseen tietojoukkoon, varmista tuloksen muodon vastaavan odotuksia ja tarkista, että ennusteet ovat järkeviä. Muotovirheiden havaitseminen ajoissa säästää myöhemmin aikaa virheenkorjauksessa.
import pandas as pd
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
X = pd.DataFrame({
'num1': np.random.randn(100),
'num2': np.random.randn(100),
'cat1': np.random.choice(['A', 'B', 'C'], 100)
})
y = np.random.randint(0, 2, 100)
ct = ColumnTransformer([
('num', Pipeline([('imp', SimpleImputer()), ('sc', StandardScaler())]), ['num1', 'num2']),
('cat', Pipeline([('imp', SimpleImputer(strategy='most_frequent')),
('enc', OneHotEncoder(sparse_output=False))]), ['cat1'])
])
pipe = Pipeline([('prep', ct), ('clf', LogisticRegression())])
pipe.fit(X, y)
print('Accuracy:', pipe.score(X, y).round(4))
print('Transformed shape:', ct.transform(X).shape)Pikatarkistus
Testaa tässä oppitunnissa oppimaasi ColumnTransformerista.
Oppitunnin yhteenveto
Tässä oppitunnissa opit, että ColumnTransformer käyttää eri muuntimia samanaikaisesti eri sarakejoukkoihin, ColumnTransformerin sijoittaminen Pipelinen sisään muodostaa yhden tarkastettavan ja tietovuodolta suojatun objektin erityyppisten tietojen esikäsittelyä varten ja että kaksoisalaviivamerkinnän avulla voit säätää mitä tahansa sisäkkäistä parametria GridSearchCV:n kautta. Seuraavaksi validoimme ristiin ja teemme koko putkelle grid-haun löytääksemme optimaaliset hyperparametrit ilman tietovuotoa.
Opi Python tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 30
- Oppitunnit
- 120
Usein kysytyt kysymykset
Onko oppitunti ”ColumnTransformer Pipeline-putkiston sisällä” ilmainen?
Kyllä – oppitunnin ”ColumnTransformer Pipeline-putkiston sisällä” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Machine Learning Academy-kurssin, päivitä CoddyKit PROhon. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”ColumnTransformer Pipeline-putkiston sisällä”?
Oppijat sijoittavat numeerisen ja kategorisen datan yhdistetyn esikäsittelyn ColumnTransformerin avulla Pipelineen, jotta heterogeeninen raakadata voidaan käsitellä suoraan ilman manuaalista jakamist… Harjoittelet Machine Learning Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Machine Learning Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Machine Learning Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”ColumnTransformer Pipeline-putkiston sisällä”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Machine Learning Academy-oppitunnilla?
Kyllä. Jokainen Machine Learning Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Ensimmäisen Pipeline-putkiston rakentaminen: skaalaus ja luokittelu
- ColumnTransformer Pipeline-putkiston sisällä
- Koko Pipeline-putkiston ristivalidointi ja ruudukkohaku
- Pipeline-putkiston tallentaminen ja lataaminen joblibillä