Модели аввал: fit ва predict
Модел барои чӣ лозим аст
Баъзан қоида пешакӣ маълум аст: масраф ба вақти кор зарби тавоноӣ баробар аст. Аммо дар ченкуниҳои воқеӣ ғавғо ҳаст ва таъсири якчанд омил номаълум мебошад. Омӯзиши мошинӣ имкон медиҳад, ки вобастагии тақрибӣ аз мисолҳо барқарор ва баъд ба объектҳои нав татбиқ шавад. Масрафи неру, вақти расонидан ва талаботро ҳамин тавр арзёбӣ мекунанд.
scikit-learn бо номи sklearn ворид мешавад. Моделҳои гуногун интерфейси умумӣ доранд: объект созед, барои омӯзиш fit ва барои пешгӯӣ predict-ро даъват кунед. Мо регрессия — пешгӯии ҷавоби ададиро меомӯзем. Таснифи категорияҳо баъдтар меояд.
1. Объектҳо, аломатҳо ва ҷавобҳо
Объект як мушоҳида аст, масалан як рӯзи кори дастгоҳ. Аломат хусусияти маълуми объект аст, масалан соатҳои кор. Ҷавоб, ё тағйирёбандаи мақсаднок, бузургиест, ки бояд пешгӯӣ шавад, масалан масрафи неру. Мисолҳои дорои ҷавобҳои маълум маҷмуаи омӯзиширо ташкил медиҳанд.
X ҷадвали аломатҳост: сатрҳо объектҳо ва сутунҳо аломатҳо мебошанд. y барои ҳар сатри X як ҷавобро бо ҳамон тартиб дорад. Ҳатто як аломатро бояд ҳамчун ҷадвал навишт, на рӯйхати ҳамвор. Шаклҳоро бо NumPy месанҷем:
import numpy as np
X = np.array([[1], [3], [5], [7]])
y = np.array([4, 8, 12, 16])
print(X.shape)
print(y.shape)
Натиҷа:
(4, 1)
(4,)
Шакли (4, 1) чор объект ва як аломатро ифода мекунад. Шакли (4,) барои y бо як ҷавоби ададӣ дуруст аст. Агар сатрҳои X бе ҷавобҳои мувофиқашон омехта шаванд, модел ҷуфтҳои нодурустро меомӯзад. Номи X ҳатмӣ нест: китобхона ба қиматҳо ва андозаҳо такя мекунад, на ба номи тағйирёбанда.
2. Сохтан, омӯзондан, пешгӯӣ кардан
Регрессияи хаттӣ ҷавобро бо формулаи y = a + b x тавсиф мекунад. a қисми доимӣ ва b тағйири ҷавоб ҳангоми як воҳид зиёд шудани аломат аст. Пеш аз омӯзиш ин қиматҳо номаълуманд. LinearRegression() танҳо моделро бо танзимот месозад; маҳз fit(X, y) коэффисиентҳоро меёбад.
Объекти нав ҳамон аломатҳоро дорад, вале ҷавобаш ҳанӯз номаълум аст. Аз ин рӯ, ба predict танҳо ҷадвали нави аломатҳоро медиҳанд. Ҳатто барои як объект бо як аломат ду ҷуфт қавс лозим аст:
from sklearn.linear_model import LinearRegression
X = [[1], [3], [5], [7]]
y = [4, 8, 12, 16]
model = LinearRegression()
print(model.fit(X, y) is model)
print(model.predict([[2], [6]]).round(2).tolist())
Натиҷа:
True
[6.0, 14.0]
fit худи моделро бармегардонад: навишти LinearRegression().fit(X, y) ба қадамҳои ҷудогона баробар аст. predict массив бармегардонад, на натиҷаи чопшуда. Дар мисол гирдкунӣ танҳо барои хондан осон аст: модел ададҳои нуқтаи шинокунандаро нигоҳ медорад, ки андаке хатои ҳисобӣ дошта метавонанд.
3. Модел чиро омӯхт
Танзимоти конструкторро гиперпараметрҳо меноманд: инсон онҳоро пеш аз омӯзиш интихоб мекунад. Параметрҳои аз додаҳо омӯхташуда баъд аз fit дар атрибутҳои дорои зерхати охир дастрас мешаванд. intercept_ узви озод, coef_ массиви коэффисиентҳо ва n_features_in_ шумораи аломатҳои вурудӣ аст.
from sklearn.linear_model import LinearRegression
model = LinearRegression().fit([[1], [3], [5], [7]], [4, 8, 12, 16])
print(round(model.intercept_, 2))
print(model.coef_.round(2).tolist())
print(model.n_features_in_)
Натиҷа:
2.0
[2.0]
1
Формулаи y = 2 + 2x ҳосил шуд. Узви озод пешгӯӣ ҳангоми сифр будани аломатҳост; агар дар додаҳо сифр набошад, ин натиҷа ҳатман маънои ҷисмонӣ надорад. Коэффисиент вобастагиро дар дохили модели интихобшуда нишон медиҳад, на далели робитаи сабабӣ.
Агар аз рӯйи маънои масъала вобастагӣ ҳатман аз сифр гузарад, fit_intercept=False-ро истифода мебаранд. Ин маҳдудияти модел аст, на роҳи ислоҳи додаҳои бад: агар қисми доимӣ сифр набошад, он пешгӯиро бадтар мекунад.
from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=False).fit([[1], [2], [4]], [3, 6, 12])
print(model.intercept_)
print(model.predict([[5]]).round(2).tolist())
Натиҷа:
0.0
[15.0]
4. Якчанд аломат ва pandas
Барои ду аломат формула y = a + b1 x1 + b2 x2 мешавад. Ҳар сатр ду адад ва coef_ ду элемент дорад. Дар DataFrame қавсҳои якка Series ва қавсҳои дугона ҷадвалро интихоб мекунанд. Сутуни ҷавобро ба X дохил намекунанд: барои объекти нав маҳз он номаълум аст.
Дар мисоли навбатӣ hours вақти кор, devices шумораи дастгоҳҳои фаъол ва energy масраф аст. Ҳамаи сатрҳо ва ҷавобҳо аллакай мувофиқанд, бинобар ин моделро бевосита аз сутунҳо омӯзондан мумкин аст:
import pandas as pd
from sklearn.linear_model import LinearRegression
df = pd.DataFrame({"hours": [1, 2, 1, 3], "devices": [1, 1, 2, 2], "energy": [10, 12, 13, 17]})
features = ["hours", "devices"]
model = LinearRegression().fit(df[features], df["energy"])
new = pd.DataFrame({"hours": [4], "devices": [3]})
print(model.coef_.round(2).tolist())
print(model.predict(new[features]).round(2).tolist())
Натиҷа:
[2.0, 3.0]
[22.0]
Дар дохил чӣ рӯй медиҳад
Ҳангоми fit китобхона андозаҳоро месанҷад, қиматҳоро ба шакли ададӣ мегузаронад ва масъалаи квадратҳои хурдтаринро ҳал мекунад: коэффисиентҳоеро интихоб мекунад, ки ҷамъи квадратҳои фарқи ҷавобҳо ва пешгӯиҳоро камтарин мекунанд. Барои вуруди зичи маъмулӣ LinearRegression ҳалкунандаи ададии алгебраи хаттиро истифода мебарад, на санҷиши дастии ҳамаи хатҳои имконпазирро.
Ҳангоми predict коэффисиентҳо дигар намешаванд. Барои ҳар сатр ҳосили зарби скалярии аломатҳо ба coef_ ҳисоб ва intercept_ илова мешавад. Ин ба формулаи барқароршудаи ҳисобкунак монанд аст: аввал онро аз мушоҳидаҳо ёфтанд, баъд ададҳои навро мегузоранд. Агар аломатҳо қариб якдигарро такрор кунанд, коэффисиентҳои ҷудогона ҳатто бо пешгӯиҳои хуб ноустувор буда метавонанд.
Пешгӯӣ дур аз ҳудуди омӯзиш экстраполятсия ном дорад. Хат он ҷо ҳам идома меёбад, вале ин кафолат намедиҳад, ки вобастагии воқеӣ хаттӣ мемонад. Сифатро дар додаҳои нав алоҳида бояд санҷид — ин мавзӯи дарси оянда аст.
Хатоҳои маъмул ва ислоҳи онҳо
X-и ҳамвор:model.fit([1, 3, 5], y)хатоиValueErrorмедиҳад: ҷадвали дученака лозим аст. Ислоҳ:[[1], [3], [5]]ёx.reshape(-1, 1).- Пешгӯӣ пеш аз омӯзиш:
LinearRegression().predict([[2]])хатоиNotFittedErrorмедиҳад. Аввалfit-ро дар мисолҳои дорои ҷавоб иҷро кунед. - Сутунҳои ивазшуда: омӯзиш дар
[hours, devices]ва пешгӯӣ дар[devices, hours]маънои ададҳоро дигар мекунад. Барои DataFrame ҳамон рӯйхатиfeatures-ро гиред; массивҳо номҳоро санҷида наметавонанд. - Ҷавоб дар аломатҳо:
df[["hours", "energy"]]ба модел аз оянда ишора медиҳад. ДарXтанҳо аломатҳои ҳангоми пешгӯӣ дастрасро гузоред. - Гирдкунӣ пеш аз пешгӯӣ: иваз кардани
coef_бо ададҳои бутун моделро дигар ва ҷавобро вайрон карда метавонад. Танҳо натиҷаи чопиро бо дақиқии талабшуда гирд кунед.
Ёднома
| Амал | Навишт |
|---|---|
| Ҷадвали объектҳо | X.shape == (n_samples, n_features) |
| Ҷавобҳои ададӣ | y.shape == (n_samples,) |
| Сохтан ва омӯзондан | LinearRegression().fit(X, y) |
| Пешгӯӣ | model.predict(X_new) |
| Хондани параметрҳо | model.intercept_, model.coef_ |
| Интихоби сутунҳо | df[features] бо ҳамон тартиб ҳангоми пешгӯӣ |