Деректер туралы ғылым: Python-да кросс-валидация

Джон Пол Мюллер, Лука Массарон

Python көмегімен кросс-валидация оңай. Егер тестілеу жиынтығы деректану ғылымында сынама алуына байланысты тұрақсыз нәтиже бере алса, шешім белгілі бір тест жиынтығының санын іріктеп алып, содан кейін нәтижелерді орташаластыру болып табылады. Бұл статистикалық тәсіл (көптеген нәтижелерді байқап, олардың орташа көрсеткіштерін алу) және бұл кросс-валидацияның негізі. Рецепт қарапайым:



  1. Деректеріңізді бүктемелерге бөліңіз (әр қатпар - бұл жағдайлардың біркелкі үлестірілуін сақтайтын контейнер), әдетте 10, бірақ 3, 5 және 20 өлшемдері - бұл баламалы нұсқалар.



  2. Бір қатпарды сынақ жиынтығы ретінде ұстаңыз, ал басқаларын жаттығулар жиынтығы ретінде пайдаланыңыз.

  3. Тест жиынтығын дайындаңыз және жазыңыз.



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

  4. Әр қатпарды кезек-кезегімен тест жиынтығы ретінде пайдаланып, 2 және 3-қадамдарды қайтадан орындаңыз.

  5. Барлық қатпарлардың сынақ нәтижелерінің орташа және стандартты ауытқуын есептеңіз.



    Орташа - сіздің болжауышыңыздың сапасының сенімді бағасы. Стандартты ауытқу сізге болжамды сенімділікті айтады (егер ол тым жоғары болса, айқасу расталуы қате болуы мүмкін). Дисперсиясы жоғары болжамшылардың кросс-валидация стандартты ауытқуы жоғары болады деп күтіңіз.

Бұл техника күрделі болып көрінгенімен, Scikit-learn оны бір сыныптың көмегімен қолданады:

>>> from sklearn.cross_validation import cross_val_score

K қатпарларында кросс-валидацияны қолдану

Кросс-валидацияны іске қосу үшін алдымен итераторды баптау керек.KFoldk қатпарларының өзара тексерілуін жүзеге асыратын итератор болып табылады. Басқа итераторлар барsklearn.cross_validationкөбінесе статистикалық тәжірибеден алынған модуль, бірақKFoldsдеректану практикасында ең кең қолданылады.

KFoldsсіздің үлгіде қанша бақылаулар бар екенін көрсетуді талап етеді (nпараметр), көрсетіңізn_қабаттарнөмірін таңдап, деректерді араластырғыңыз келетіндігін көрсетіңіз (араластырупараметр). Әдетте, күтілетін дисперсия неғұрлым жоғары болса, соғұрлым бүктемелер санын көбейту сізге орташа бағаны бере алады. Деректерді араластырған жөн, өйткені тапсырыс берілген мәліметтер оқу процестерінде шатасулар тудыруы мүмкін, егер алғашқы бақылаулар соңғыларынан өзгеше болса.

Орнатқаннан кейінKFolds, қоңырау шалыңызкросс-мән_ұпайыфункциясы, ол әр айқындау қатпарына ұпай (балл функциясынан) бар нәтижелер жиымын қайтарады. Сіз қамтамасыз етуіңіз кереккросс-мән_ұпайыдеректеріңізбен (екеуі де)XжәнеY) кіріс ретінде, сіздің бағалаушыңыз (регрессия класы) және бұрын инстанцияланғанKFoldsитератор (резюмепараметр).

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

crossvalidation = KFold(n=X.shape[0], n_folds=10, shuffle=True, random_state=1) scores = cross_val_score(regression, X, y, scoring=‘mean_squared_error’, cv=crossvalidation, n_jobs=1) print ‘Folds: %i, mean squared error: %.2f std: %.2f’ %(len(scores),np.mean(np.abs(scores)),np.std(scores)) Folds: 10, mean squared error: 23.76 std: 12.13

Кросс-валидация параллельді жұмыс істей алады, өйткені ешқандай бағалау басқа бағалауға тәуелді емес. Параметрді орнату арқылы компьютердегі бірнеше ядролардың артықшылығын пайдалануға боладыn_жұмыс = -1.

Күрделі мәліметтер үшін іріктеу стратификациясы

Кросс-валидация қатпарлары кездейсоқ таңдау арқылы шешіледі. Кейде дұрыс емес үлгілерден аулақ болу үшін жаттығуларда және сынақ қатпарларында белгілі бір сипаттаманың бар-жоғын және қаншалықты екенін бақылау қажет болуы мүмкін. Мысалы, Бостондағы деректер жиынтығында үйдің Чарльз өзенімен шектесетінін көрсететін екілік айнымалы бар (мәні 1 немесе 0-ге тең).

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

import pandas as pd df = pd.DataFrame(X, columns=boston.feature_names) df[‘target’] = y boxplot = df.boxplot(‘target’, by=‘CHAS’, return_type=‘axes’)

Қорап алаңы өзендегі үйлердің басқа үйлерге қарағанда жоғары мәнге ие екендігін көрсетеді. Әрине, Бостонның айналасында қымбат үйлер бар, бірақ сіз қанша өзен үйін талдайтындығыңызды қадағалап отыруыңыз керек, өйткені сіздің моделіңіз тек Чарльз Ривердің үйлері емес, бүкіл Бостон үшін жалпы болуы керек.

CHAS бойынша топталған мақсатты нәтиженің қорапшасы.CHAS бойынша топталған мақсатты нәтиженің қорапшасы.

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

TheStratifiedKFoldкласс кросс-валидация процедуралары кезінде дұрыс емес үлгілерді құру қаупін бақылаудың қарапайым әдісін ұсынады. Ол белгілі бір мүмкіндіктер, тіпті белгілі бір нәтижелер (мақсатты сыныптар өте теңгерімсіз болған кезде) әрқашан дұрыс пропорцияда болатындай етіп іріктеуді басқара алады. Көмегімен басқару қажет айнымалыны көрсету керекYпараметр.

from sklearn.cross_validation import StratifiedKFold stratification = StratifiedKFold(y=X[:,3], n_folds=10, shuffle=True, random_state=1) scores = cross_val_score(regression, X, y, scoring=‘mean_squared_error’, cv=stratification, n_jobs=1) print ‘Stratified %i folds cross validation mean ‘ + ‘squared error: %.2f std: %.2f’ % (len( scores),np.mean(np.abs(scores)),np.std(scores)) Stratified 10 folds cross validation mean squared error: 23.70 std: 6.10

Тексеру қатесі ұқсас болғанымен, басқару арқылыҚАРСЫөзгермелі болса, бағалаудың стандартты қателігі азаяды, бұл сіз айнымалының алдыңғы айқасу нәтижелеріне әсер еткенін білесіз.