Shanraq.org Shanraq.org
Модель қайда бітеді
IT

Python: деректен өз есебіңізге дейін 47-сабақ (барлығы 56)

Модель қайда бітеді

Python курсының қырық алтыншы сабағы, модельдер модулінің соңы. Сол түзу 2100 жылға 146 206 индексін уәде етеді — әрі бірде-бір жауабын күмәнді деп белгілемейді. Шекараны қолмен жазуға тура келеді: неде үйренді, қайда тексерілді, қандай ауқымда қателеседі, қай жылдан кейін қолданылмайды.

Не үшін керек

Модель әрқашан жауап береді. Бұл оның басты қасиеті әрі басты қаупі: 2100 жыл туралы сұраңыз — сан аласыз, 1800 туралы сұраңыз — оны да аласыз, әрі екеуі бірдей сенімді көрінеді.

Өткен үш сабақ қатені санауды үйретті. Бұл сабақ — бәрі саналып болғанда сөзбен айтуға қалатыны туралы: модель нені көрмеген, не туралы тіпті білмейді және оған сұрақ қоюға болатын аймақ қайда бітеді.

Бірден тұтас

granica.py файлы. Қатарлар нағыз: Қазақстан, Швейцария және Жапонияның баға индекстері, Дүниежүзілік банк, үшеуінде де 2010 = 100. Модель — қырық үшінші сабақтағы сол логарифм бойынша түзу.

"""46-сабақ: модель қайда бітеді.

Қатарлар нағыз: Қазақстанның, Швейцарияның және Жапонияның тұтыну бағасының
индекстері, 2010 = 100, Дүниежүзілік банктің FP.CPI.TOTL көрсеткіші. Модель —
қырық үшінші сабақтағы сол логарифм бойынша түзу.
"""

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression

KAZAKHSTAN = pd.Series({
    2010: 100.00, 2011: 108.45, 2012: 114.09, 2013: 120.87, 2014: 129.15,
    2015: 137.77, 2016: 157.56, 2017: 169.28, 2018: 179.72, 2019: 189.30,
    2020: 202.02, 2021: 218.27, 2022: 251.07, 2023: 287.54, 2024: 312.53,
    2025: 348.12,
})
# Сол жылдар, басқа елдер: үшеуінде де 2010 = 100, сондықтан сандар салыстырмалы.
SWITZERLAND = pd.Series({2010: 100.00, 2015: 98.17, 2020: 98.82, 2025: 105.67})
JAPAN = pd.Series({2010: 100.00, 2015: 103.59, 2020: 105.46, 2025: 118.04})


def trained_on(series):
    """Индекс логарифмі бойынша түзу. «Жыл туралы сұра» функциясын қайтарады."""
    model = LinearRegression().fit(
        ((series.index.to_numpy() - 2010) / 10).reshape(-1, 1),
        np.log(series.to_numpy()))
    return lambda years: np.exp(
        model.predict(((np.array(years) - 2010) / 10).reshape(-1, 1)))


ask = trained_on(KAZAKHSTAN)

print("== Модель әрқашан жауап береді")
for year in (2030, 2040, 2100):
    print(f"  {year}: {ask([year])[0]:.1f}")
for year in (1990, 1900):
    print(f"  {year}: {ask([year])[0]:.3f}")
print("  бұл жауаптардың бірде-бірін ол күмәнді деп белгілеген жоқ")

print()
print("== Ол көрмеген нәрсесін білмейді")
quiet = trained_on(KAZAKHSTAN[KAZAKHSTAN.index <= 2019])
for year in (2022, 2025):
    guess = float(quiet([year])[0])
    print(f"  {year}: уәде {guess:.1f}, шын мәнінде {KAZAKHSTAN[year]:.2f}"
          f" — қателік {KAZAKHSTAN[year] - guess:.1f}")
print("  модель тыныш жылдарда үйренді, ал 2022 тыныш болған жоқ")

print()
print("== Ол қай ел туралы екенін білмейді")
guess_2025 = float(ask([2025])[0])
other = pd.DataFrame({
    "2025 шын мәнінде": [KAZAKHSTAN[2025], SWITZERLAND[2025], JAPAN[2025]],
    "модель уәдесі": [round(guess_2025, 1)] * 3,
}, index=["Қазақстан", "Швейцария", "Жапония"])
other["қателік"] = (other["2025 шын мәнінде"] - other["модель уәдесі"]).round(1)
print(other.to_string())
print("  модельдің белгісі біреу — жыл; белгілердің арасында ел жоқ")

print()
print("== Бір сан мен ауқым")
past = KAZAKHSTAN.index <= 2021
checked = trained_on(KAZAKHSTAN[past])
errors = (KAZAKHSTAN[~past] - checked(KAZAKHSTAN[~past].index.to_numpy())).abs()
print(errors.round(1).to_string())
print(f"  орташасы: {errors.mean():.1f}; төрт жылда байқалғаны:"
      f" {errors.min():.0f}{errors.max():.0f} индекс пункті")

print()
print("== Модельде мүлде жоқ нәрсе")
model = LinearRegression().fit(
    ((KAZAKHSTAN.index.to_numpy() - 2010) / 10).reshape(-1, 1),
    np.log(KAZAKHSTAN.to_numpy()))
print("  кірістегі белгі саны:", model.n_features_in_)
print("  олардың арасында жоқ: индекс немен өлшенген, қатарды кім қайта қараған,")
print("  қате неге тұрады және бұл жауап кімге керек")

Шығысы:

== Модель әрқашан жауап береді
  2030: 487.0
  2040: 1100.2
  2100: 146206.2
  1990: 18.701
  1900: 0.012
  бұл жауаптардың бірде-бірін ол күмәнді деп белгілеген жоқ

== Ол көрмеген нәрсесін білмейді
  2022: уәде 238.4, шын мәнінде 251.07 — қателік 12.6
  2025: уәде 297.2, шын мәнінде 348.12 — қателік 50.9
  модель тыныш жылдарда үйренді, ал 2022 тыныш болған жоқ

== Ол қай ел туралы екенін білмейді
           2025 шын мәнінде  модель уәдесі  қателік
Қазақстан            348.12          324.0     24.1
Швейцария            105.67          324.0   -218.3
Жапония              118.04          324.0   -206.0
  модельдің белгісі біреу — жыл; белгілердің арасында ел жоқ

== Бір сан мен ауқым
2022    15.1
2023    33.9
2024    39.9
2025    55.1
  орташасы: 36.0; төрт жылда байқалғаны: 15–55 индекс пункті

== Модельде мүлде жоқ нәрсе
  кірістегі белгі саны: 1
  олардың арасында жоқ: индекс немен өлшенген, қатарды кім қайта қараған,
  қате неге тұрады және бұл жауап кімге керек

Талдау

Модель әрқашан жауап береді

  2100: 146206.2
  1900: 0.012

Бұл сандардың бірде-бірін модель белгілеген жоқ. Ол оны істей алмайды: predict — формулаға санды қою, ал формулада «тым алыс» деген ұғым жоқ.

1900 жылға 0.012 индексі сол кезде бәрі 2010 жылғымен салыстырғанда сегіз мың есе арзан болған дегенді білдіреді. Жаттығуда логарифмсіз түзу 1800 жылға минус мың сегіз жүз береді — болмайтын нәрсе, теріс баға индексі. Модель бұған шағымданбайды, өйткені шағымданатын ештеңесі жоқ: мағынаны тексеру — оның бөлігі емес.

Ол көрмеген нәрсесін білмейді

  2022: уәде 238.4, шын мәнінде 251.07 — қателік 12.6
  2025: уәде 297.2, шын мәнінде 348.12 — қателік 50.9

Тыныш 2010–2019 жылдарда үйретілген түзу тыныш әлемді сипаттайды. 2022 сол әлемге сыймайды, әрі әрі қарай қате тек өседі: деректе болмағанды модель ойлап таппайды.

Бұл күрделілікпен де, сол тектес деректің көптігімен де емделмейді. Емдейтіні біреу — режимнің ауысқанын дауыстап атау: «модель шоксыз жылдарды сипаттайды».

Ол қай ел туралы екенін білмейді

           2025 шын мәнінде  модель уәдесі  қателік
Қазақстан            348.12          324.0     24.1
Швейцария            105.67          324.0   -218.3

Модельдің белгісі біреу — жыл. Белгілердің арасында ел жоқ, сондықтан «Швейцарияның 2025 жылғы индексі қандай болады» деген сұраққа ол қазақстандық санмен жауап береді әрі үш есе қателеседі.

Айқын нәрсе сияқты естіледі, бірақ нағыз қателердің көбі дәл осылай көрінеді: модель пішіні ұқсас деректе қолданылады — сол жылдар, сол индекс, — әрі оның басқа нәрседе үйретілгені ұмытылады.

Бір сан мен ауқым

2022    15.1
2025    55.1
  орташасы: 36.0; төрт жылда байқалғаны: 15–55 индекс пункті

Орташа қате модельдерді салыстыруға ыңғайлы. Төрт тексеру жылында абсолют қателер 15-тен 55 индекс пунктіне дейін болды, орташа мәні — 36. Бұл тек төрт бақылаудың сипаттамасы, болжам аралығы емес: келесі қате осы шектен шығуы мүмкін.

Сондықтан есепте орташа қатені де, байқалған ауқымды да, тексеру жылдарының санын да көрсету керек. Төрт қатенің ең кішісі мен ең үлкенін болашақтың кепілді шегі деп көрсетуге болмайды.

Модельде мүлде жоқ нәрсе

  кірістегі белгі саны: 1

Қырық бірінші сабақ қайта қарау мен анықтамалар туралы айтқанның бәрі модельге кірмейді. Қырық бесінші сабақ қатенің бағасы туралы айтқаны да: модель жалған дабылдың өткізіп алудан немен ерекшеленетінін білмейді, себебі оған кім не үшін сұрап тұрғанын айтқан жоқ.

Бұл нақты бір түзудің кемшілігі емес. Бұл бүкіл кластың шекарасы: модель өзіне берілген бағандарды ғана біледі, одан басқа ештеңені білмейді.

Санның қасына не жазады

Модульді жабатын қысқа жол:

баға индексі, модель 2010–2021 жылдарда үйретілген, тексерудегі қатесі 15–55 тармақ, 2021 жылдан кейін қолданылмайды

Төрт факт: нені санайды, неде үйренді, қаншаға қателеседі, қайда бітеді. Мұндай жолды есептегі кез келген санның астына қоюға болады, әрі тапсырмада оны бағдарлама жинайды — сыпайылықтан емес, өлшемдерден.

Сабақ картасы

Сабақ картасы: жауап, дерек шеті және шекара

Өз сөзіңізбен айтыңыз

Қарамай, дауыстап немесе қағазға жауап беріңіз. Жауаптар — сабақтың соңында.

  1. Модель 2100 жылдың тым алыс екенін неге ескертпейді?
  2. Дерек түрі сол болса, «модель қай ел туралы екенін білмейді» дегені не?
  3. Есепке орташа емес, қате ауқымы неге барады?

Жаттығу

Тапсырмаға дейінгі үш қысқа қадам: болжау, толықтыру, түзету. Жауаптар — сабақтың соңында, бірақ алдымен өзіңіз жауап беріңіз.

1. Болжаңыз. Бағдарлама 1800 жылға не басып шығарады?

import numpy as np
from sklearn.linear_model import LinearRegression

years = np.array([[2020], [2021], [2022], [2023]])
index = np.array([100.0, 108.0, 117.0, 126.0])
model = LinearRegression().fit(years, index)
print("2024:", round(float(model.predict(np.array([[2024]]))[0]), 1))
print("1800:", round(float(model.predict(np.array([[1800]]))[0]), 1))

2. Бос орынды толтырыңыз. ... орнына модель мұндай жылды көрген-көрмегенін тексеріңіз.

# модель тек өзі көрген жылдар туралы жауап береді
first, last = 2010, 2021
for year in (2015, 2030):
    known = ...
    print(year, "дерек ішінде" if known else "дерек шетінен тыс")

3. Түзетіңіз. Бағдарлама 2025 жылға болжамды өлшем сияқты басып шығарады.

# жауаптың қасында — неде үйренгені және қай жылға дейін қолданылатыны
answer, first, last = 293.1, 2010, 2021
print(f"2025: {answer}")

Тапсырма

Міндетті. Модельдің паспортын жинаңыз: қай жылдарда үйренді әрі онда неше нүкте бар, қай жылдарда тексерілді әрі қандай ауқымда қателеседі, белгісі нешеу және қолдану аясы қайда бітеді. Сосын модель тек белгілі жылдар туралы жауап беретіндей етіңіз, қалғанына «дерек шетінен тыс» десін — әрі сол шекарасыз не жауап берер едіңіз, соны көрсетіңіз. Соңында есепке арналған бір жолды түгелдей өлшенгеннен жинаңыз.

Күтілетін шығыс:

== Модель паспорты
  үйренді: 2010-2021, нүкте саны 12
  тексерілді: 2022-2025, қатесі 15-55 тармақ
  кірістегі белгі саны: 1
  қолдану аясы: 2010-2021 — одан әрі болжам басталады

== Іштегі және сырттағы жауаптар
  2015: 142.3
  2021: 219.5
  2025: дерек шетінен тыс, модель 2010-2021 көрген
  2030: дерек шетінен тыс, модель 2010-2021 көрген

== Шекара болмаса не болар еді
  2025: 293.1
  2030: 420.5
  2100: 66029.9
  сол сандар, тек енді бұл экстраполяция екені көрініп тұр

== Есепке арналған адал жол
  баға индексі, модель 2010-2021 жылдарда үйретілген, тексерудегі қатесі 15-55 тармақ, 2021 жылдан кейін қолданылмайды

Дайын болғаны: шығыс жол-жолымен сәйкес келеді; шекара модельдің кодында тұрады, оны шақырушының есінде емес; шетке шығу тек анық аргументпен мүмкін; есепке арналған жол қолмен терілмей, сандардан жиналады.

Өз деректеріңізде. Кез келген өз моделіңізді алыңыз — тіпті ай бойынша орташаны — әрі оның астына сол төрт фактіден тұратын жол жазыңыз. Солардың біреуін де санмен толтыра алмасаңыз, дәл сол жерде модель сіз ойлағаннан ерте бітеді.

Қалауыңыз бойынша.

  • Паспортқа қатесі он тармақтан асқан жылдардың үлесін қосыңыз: орташадан адалырақ бір сан.
  • ask санды емес, «жауап, ескерту» жұбын қайтаратын етіңіз — әрі оны шақыратын кодтың қалай өзгеретінін қараңыз.
  • Модельді Швейцарияда үйретіп, одан Қазақстан туралы сұраңыз. Қате айналы болады, әрі бұл — мәселенің елде емес, модельдің білмейтінінде екеніне көз жеткізудің жақсы тәсілі.

Жобада бұл қайда тұрады

Жиырма төртінші қадам, модульдегі соңғысы: жиынтық өзінің нені айтпайтынын жазады.

Беттің төменгі жағында тізім пайда болады, әрі оның бірде-бір жолы қолмен терілмеген. esep.shekteu әр санды оны санаған кестеден алады:

 • болжам жоқ: тренд өз жылдарында 3.55 тармаққа дейін қателеседі
 • баға мен ақшаның байланысы саналмады: 2 ел, 8 керек
 • ақша массасы жоқ ел: RUS
 • жылдар: 2025 дейін; одан кейінгі жыл туралы есеп ештеңе айтпайды

Мәні дәл тізімнің деректен жиналуында. Подвалда бір рет жазылған ескертпені жарты жылдан кейін ешкім қайта оқымайды, әрі ол бірінші болып өтірік айта бастайды. Өз цифрын үстіндегі кестеден алатын жол сол кестемен бірге өзгереді.

Бұл — бүкіл жиынтықтағы ең арзан бөлік: бір функция және беттегі төрт жол. Әрі есептің тұжырымнан айырмасы да осы.

Жауаптар

Жауаптарды көрсету

Сұрақтарға

  1. Өйткені predict — формулаға қою, ал формулада деректен қашықтық деген ұғым жоқ. Шекараны модель емес, оны үйреткен адам біледі; ол жазбаса, шекара еш жерде жоқ.
  2. Модельге «ел» деген белгі кірмейтінін: ол тек жылды және Қазақстанның индексін көрген. Пішіні ұқсас дерек — сол жылдар, индекстің сол түрі — оны Швейцарияның моделіне айналдырмайды, әрі 218 тармақтық қате мұны көрсетеді.
  3. Өйткені орташа өлшем сияқты естіледі, ал төрт жылда қате 15-тен 55 тармаққа дейін жайылды. Ауқым бар нәрсені айтады; орташа белгілі болғаннан көбін айтады.

Жаттығуға

  1. Түзу солға төмен шексіз кетеді, сондықтан 1800 жылға ол теріс баға индексін береді — болмайтын шаманы. Модель бұны білмейді.
2024: 134.5
1800: -1814.3
  1. first <= year <= last. Шекара — модель көргенмен салыстыру, оны шақырушының болжамы емес.
# модель тек өзі көрген жылдар туралы жауап береді
first, last = 2010, 2021
for year in (2015, 2030):
    known = first <= year <= last
    print(year, "дерек ішінде" if known else "дерек шетінен тыс")
2015 дерек ішінде
2030 дерек шетінен тыс
  1. Сан өздігінен қайдан шыққанын айтпайды. Оның қасына үйрену жылдары және бұның экстраполяция екені жазылады.
# жауаптың қасында — неде үйренгені және қай жылға дейін қолданылатыны
answer, first, last = 293.1, 2010, 2021
print(f"2025: {answer} (модель {first}-{last} жылдарда үйретілген, бұл экстраполяция)")
2025: 293.1 (модель 2010-2021 жылдарда үйретілген, бұл экстраполяция)

Тапсырмаға

Тапсырмадағы бастысы — шекараның ask ішінде тұруы, оны шақыратын адамның есінде емес. 2030 жыл туралы жауап беруден өзі бас тартатын модель өзін емес, жарты жылдан кейін бұл кодты алып, оның неде үйренгенін оқымайтын адамды қорғайды.

Әрі «шекара болмаса» блогына назар аударыңыз: сол 420.5 пен 66029.9 сандары еш жерге кеткен жоқ әрі бұрынғысынша қолжетімді — бірақ енді олардың артына анық аргументпен бару керек. «Модель айтты» мен «мен одан шетке шығуын сұрадым» дегеннің арасы бір жол кодқа тұрады.

Дереккөздер

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Тапсырманы тексеру

Алдымен VS Code-та шешіп, іске қосыңыз — редактор қатені сол жерде көрсетеді. Дайын шешімді осында қойыңыз. Тексеретін — модель: ол қатені атап көрсетеді, бірақ дайын жауапты бермейді.

Тексеру үшін кіру керек. Кіру

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.