Омодасозии аломатҳо
Чаро аломатҳоро омода мекунанд
Модел бо ададҳо кор мекунад, вале маънои масофаи байни онҳо аз воҳидҳо вобаста аст. Агар як сутун вақт бо соат ва дигаре истеҳсол бо ҳазорҳо бошад, сутуни дуюм метавонад қариб пурра масофаи kNN-ро муайян кунад. Иваз кардани соат ба дақиқа набояд аҳамияти хусусиятро дигар кунад, аммо бе омодасозӣ ҳисобҳои моделро тағйир медиҳад.
Ғайр аз ин, дар ҷадвалҳо категорияҳо ҳастанд: ҳолати таҷҳизот, навъи мол, шаҳр. Сатрро ба коэффисиенти модели хаттӣ зарб задан намешавад. Омодасозии аломатҳо ҷадвали аслиро ба додаҳои ададии мувофиқ табдил медиҳад. Қоидаҳои он низ аз додаҳо омӯхта мешаванд, бинобар ин онҳоро аз ихроҷи маълумоти тест муҳофизат бояд кард.
1. Стандартӣ кардани сутунҳо
Стандартонӣ аз ҳар қимат миёнаи сутунашро тарҳ карда, ба инҳирофи стандартӣ тақсим мекунад: z = (x-μ)/σ. Миёна маркази қиматҳо ва инҳирофи стандартӣ парокандагии маъмули атрофи онро нишон медиҳад. Баъди табдил сутуни ғайридоимии омӯзишӣ миёнаи тақрибан 0 ва инҳирофи стандартии тақрибан 1 дорад.
StandardScaler.fit(X) оморҳоро нигоҳ медорад, transform(X) онҳоро татбиқ мекунад. fit_transform(X) ҳар ду амалро якҷоя иҷро мекунад. Сутунҳо мустақилона коркард мешаванд, сатрҳо ва тартибашон нигоҳ дошта мешаванд. Дар мисол сутуни дуюм доимист:
from sklearn.preprocessing import StandardScaler
X = [[10, 7], [20, 7], [30, 7]]
scaler = StandardScaler().fit(X)
print(scaler.mean_.tolist())
print(scaler.scale_.round(3).tolist())
print(scaler.transform(X).round(3).tolist())
Натиҷа:
[20.0, 7.0]
[8.165, 1.0]
[[-1.225, 0.0], [0.0, 0.0], [1.225, 0.0]]
Дисперсия дар ин ҷо бо тақсим ба n ҳисоб мешавад, мисли numpy.std(..., ddof=0), на ба n-1. Дар mean_ миёнаҳо, дар var_ дисперсияҳо ва дар scale_ тақсимкунандаҳои истифодашуда ҷойгиранд. Барои сутуни доимӣ тақсимкунанда 1 аст: қиматҳои омӯзишӣ бе тақсим ба сифр ба сифрҳо табдил меёбанд. Қимати нави аз ин доимӣ фарқкунанда ҳатман сифр намешавад.
Стандартонӣ тақсимотро нормалӣ намекунад ва қиматҳои дурро нест намесозад. Қимати ниҳоӣ миёна ва инҳирофро дигар мекунад; агар онҳо муҳим бошанд, алоҳида таҳқиқ кунед. Ин табдили миқёс аст, на ислоҳи умумии сифати додаҳо.
2. Миқёсбандӣ аз рӯйи минимум ва максимум
MinMaxScaler бо нобаёнӣ формулаи (x-min)/(max-min)-ро истифода мебарад. Минимуми сутуни омӯзишӣ 0 ва максимуми он 1 мешавад. Ин барои фосилаи фаҳмо ва набудани қиматҳои хеле дур қулай аст. Қиматҳои нав метавонанд аз [0, 1] берун раванд, зеро минимум ва максимуми пешина истифода мешаванд. Ҳангоми зарурат clip=True натиҷаро маҳдуд мекунад.
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler().fit([[0], [5], [10]])
print(scaler.transform([[0], [5], [10]]).tolist())
print(scaler.transform([[15]]).tolist())
Натиҷа:
[[0.0], [0.5], [1.0]]
[[1.5]]
3. Табдилро танҳо дар омӯзиш омӯзонед
Ихроҷи додаҳо ворид шудани маълумот ба омӯзиш аст, ки ҳангоми пешгӯии воқеӣ дастрас намешавад. Ҳатто миёнаи сутуни санҷишӣ чунин маълумот аст. Аз ин рӯ, аввал додаҳои аслиро ҷудо мекунанд ва баъд табдилро бо fit дар X_train меомӯзонанд. Сипас ҳам омӯзиш ва ҳам тест бо як объект табдил меёбанд.
fit_transform(X_test)-и такрорӣ миқёси пешинаро татбиқ намекунад, балки аз рӯйи тест миқёси нав месозад. Ду ҳароратсанҷро бо нуқтаҳои гуногуни сифр тасаввур кунед: адади яксон дар онҳо ҳарорати яксон нест. Инро дар як объекти нав месанҷем:
from sklearn.preprocessing import StandardScaler
X_train = [[2], [4]]
X_test = [[10]]
scaler = StandardScaler().fit(X_train)
print(scaler.transform(X_test).tolist())
print(StandardScaler().fit_transform(X_test).tolist())
Натиҷа:
[[7.0]]
[[0.0]]
Сатри аввал миёнаи 3 ва инҳирофи 1-ро аз омӯзиш истифода мебарад. Дуюм объектро нисбат ба худаш тавсиф карда, ҷойи онро дар миқёси омӯзишӣ гум мекунад.
4. Категорияҳо бе тартиби сохта
Барои аломати категориявии «ҳолати S ё T» рақамҳои 1 ва 2 тартиб ва масофаи сунъӣ месохтанд. One-hot encoding барои ҳар категория сутуни ҷудогона месозад: 1 мувофиқат ва 0 набуданро мефаҳмонад. Ин сутунҳо баробаранд ва дараҷаи ададӣ намесозанд.
OneHotEncoder.fit категорияҳои ҷадвали омӯзиширо нигоҳ медорад. categories_ рӯйхати онҳоро барои ҳар сутуни аслӣ дорад. Натиҷа бо нобаёнӣ тунук (sparse) аст: асосан қиматҳои ғайрисифрӣ нигоҳ дошта мешаванд. Барои мисоли хурд дар scikit-learn 1.4.2 бо sparse_output=False массиви одӣ гирифтан қулай аст. Бо категорияҳои зиёд массиви зич метавонад хотираи зиёд гирад.
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(handle_unknown="ignore", sparse_output=False)
enc.fit([["T"], ["S"], ["T"]])
print(enc.categories_[0].tolist())
print(enc.transform([["T"], ["U"]]).tolist())
Натиҷа:
['S', 'T']
[[0.0, 1.0], [0.0, 0.0]]
Категорияҳои сатрӣ дар мисол мураттабанд: аввал S, баъд T. U-и ношинос бо handle_unknown="ignore" барои ин аломат сифрҳо мегирад. Бе ин танзим transform хато медод. Бо якчанд аломати аслӣ категорияи ношинос танҳо гурӯҳи сутунҳои худашро сифр мекунад.
5. Конвейери омодасозӣ ва модел
Pipeline, ё конвейер, табдилҳо ва модели ниҳоиро дар як объект муттаҳид мекунад. Он ҳамон fit, predict, score-ро дорад. Ҳангоми омӯзиш аввал табдилро меомӯзад ва аломатҳоро омода мекунад, баъд таснифгарро меомӯзонад. Ҳангоми пешгӯӣ танҳо қоидаҳои омодасозии аллакай омӯхташударо истифода мебарад ва онҳоро аз объектҳои нав намеомӯзад.
make_pipeline ба қадамҳо худкор ном медиҳад. Дар мисол додаҳои омӯзишӣ ва санҷишӣ алоҳида дода шудаанд; миқёсбандӣ ҳангоми fit объектҳои санҷиширо намебинад.
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
X_train = [[0, 100], [1, 120], [2, 140], [8, 900], [9, 920], [10, 940]]
y_train = [0, 0, 0, 1, 1, 1]
model = make_pipeline(StandardScaler(), KNeighborsClassifier(n_neighbors=3))
model.fit(X_train, y_train)
print(model.predict([[1, 130], [9, 930]]).tolist())
print(list(model.named_steps))
Натиҷа:
[0, 1]
['standardscaler', 'kneighborsclassifier']
Конвейер барои ҷойгир кардани омодасозӣ дар дохили санҷиши салибӣ кӯмак мекунад, вале ихроҷи аллакай дар аломатҳои аслӣ ё ҷадвали аз тамоми додаҳо пешакӣ омодашударо ислоҳ намекунад. Ба он додаҳои аслиро диҳед ва fit-ро танҳо дар қисми иҷозатдодашудаи омӯзишӣ иҷро кунед.
6. Табдилҳои гуногун барои сутунҳои гуногун
ColumnTransformer гурӯҳҳои сутунҳоро интихоб мекунад: ададҳоро миқёсбандӣ ва категорияҳоро рамзгузорӣ кардан мумкин аст. Натиҷаҳо ба ҷадвали умумии ададӣ пайваст шуда, ба модел мерасанд. Сутунҳои нишоннадодашуда бо нобаёнӣ партофта мешаванд. Номҳои табдилҳо мисли num ва cat калидҳои хизматӣ ҳастанд, на аломатҳои нави аслӣ.
Мисоли навбатӣ як аломати ададӣ ва як аломати категориявиро муттаҳид мекунад; баъди рамзгузорӣ се сутун ҳосил мешавад.
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.pipeline import make_pipeline
from sklearn.neighbors import KNeighborsClassifier
X = pd.DataFrame({"hours": [1, 2, 8, 9], "mode": ["S", "S", "T", "T"]})
y = [0, 0, 1, 1]
prepare = ColumnTransformer([
("num", StandardScaler(), ["hours"]),
("cat", OneHotEncoder(handle_unknown="ignore", sparse_output=False), ["mode"])
])
model = make_pipeline(prepare, KNeighborsClassifier(n_neighbors=1)).fit(X, y)
new = pd.DataFrame({"hours": [1.5, 8.5], "mode": ["S", "T"]})
print(prepare.transform(X).shape)
print(model.predict(new).tolist())
Натиҷа:
(4, 3)
[0, 1]
Дар дохил чӣ рӯй медиҳад
Табдилдиҳанда омӯзиши қоида ва татбиқи онро ҷудо мекунад. StandardScaler барои ҳар сутун якчанд адад ва OneHotEncoder луғати категорияҳоро нигоҳ медорад. Аз ин рӯ, шумора ва тартиби аломатҳои вурудӣ ҳангоми transform бояд ба омӯзиш мувофиқ бошанд. Конвейер натиҷаи як қадамро ба дигараш медиҳад: ҳангоми fit қадамҳои миёна fit_transform ва қадами охир fit мекунанд; ҳангоми predict қадамҳои миёна transform ва қадами охир predict мекунанд.
Ин ба хатти истеҳсол монанд аст: аввал таҷҳизотро бо гурӯҳи омӯзишӣ танзим мекунанд, баъд ҳар ҷузъи навро аз ҳамон танзимот мегузаронанд. Иваз кардани танзим дар миёна натиҷаҳоро муқоисанопазир мекунад.
Хатоҳои маъмул ва ислоҳи онҳо
- Ихроҷ пеш аз тақсимот:
StandardScaler().fit_transform(X)дар тамоми ҷадвал тести ояндаро истифода мебарад. Аввал додаҳои аслиро ҷудо кунед. - Fit-и такрорӣ дар тест:
scaler.fit_transform(X_test)оморҳоро иваз мекунад. Аз объекти омӯзонидашудаscaler.transform(X_test)-ро истифода баред. - Миқёсҳои гуногун: омӯзиш дар аломатҳои миқёсбандишуда ва
predict(X_test)дар аломатҳои аслӣ масофаҳои бемаънӣ медиҳад. Конвейер ё ҳамонtransform-ро барои ҳамаи қисмҳо гиред. - Рӯйхати ҳамвори категорияҳо:
enc.fit(["S", "T"])ҷадвал нест.[["S"], ["T"]]-ро диҳед. - Номи кӯҳнаи параметр:
OneHotEncoder(sparse=False)барои версияи 1.4.2 мувофиқ нест. Барои натиҷаи зичsparse_output=False-ро истифода баред.
Ёднома
| Абзор | Чиро нигоҳ медорад ё иҷро мекунад |
|---|---|
StandardScaler |
миёна ва парокандагии ҳар сутун |
MinMaxScaler |
минимум ва максимуми омӯзиш |
fit_transform(X_train) |
омӯзиш ва татбиқи қоида |
transform(X_test) |
татбиқи қоидаи пешина |
OneHotEncoder |
категорияҳо → сутунҳои нишондиҳанда |
handle_unknown="ignore" |
категорияи ношинос → сифрҳои гурӯҳи он |
make_pipeline(...) |
омодасозӣ ва модел пайдарпай |
ColumnTransformer(...) |
қоидаҳои гуногун барои сутунҳо |