æ©æ¢°åŠç¿ãšãã€ãã©ã€ã³
ãšã³ãžãã¢ã®çããã¯ãããã€ãã©ã€ã³ããšããã°äœãæãæµ®ãã¹ãã§ããããïŒ
æããå€ãã®äººã¯ã
â æè¿ãããã³ã°ãããããšã§è©±é¡ã®ãç³æ²¹èŒžé管
â¡åºæ¬æ
å ±è©Šéšãªã©ã§é »åºã®ãCPUã®äžŠè¡åœä»€å®è¡ã®ä»çµã¿
ãæãæµ®ãã¹ãããšæããŸãã

â»ç»åã¯Wikipediaãã
æ©æ¢°åŠç¿åéã§ããScikit-LearnãMLOpsç³»ã®ããŒã«ã«ãããŠé »åºããçšèªã§ããã
äœãšãªãããè€æ°ã®åŠçãé£ç¶ã§è¡ãä»çµã¿ããšãã£ãã€ã¡ãŒãžãæãããŠããæ¹ãå€ãããšæããŸãã
ã§ãããé£ç¶åŠçãªãååŠçãé çªã«å®è£ ããã°åæ§ã®æ©èœãå®çŸã§ãããããæ£çŽ
ãã¡ãªãããããåãããïŒã
ãšæãããŠããæ¹ãå€ãããšæããŸãã
ç§ãããæã£ãŠããŸãããã調ã¹ãŠã¿ããšãå Žé¢ã«ãã£ãŠã¯å¿
èŠäžå¯æ¬ ãšèšãããããªã¡ãªãããããäºãåãã£ãã®ã§ã
èšäºã«ãŸãšããããšæããŸã
ãã€ãã©ã€ã³ãšã¯ïŒ
ãã€ãã©ã€ã³ã®æŠèŠãšå®è£ äŸã解説ããŸã
æ©æ¢°åŠç¿ãšååŠç
äžè¬çã«æ©æ¢°åŠç¿ã¯ãåŠç¿åšïŒãµããŒããã¯ã¿ãŒãã·ã³ãã©ã³ãã ãã©ã¬ã¹ããªã©ïŒãé©çšããã ãã§ã¯æ§èœãçºæ®ã§ãããäºåã«ååŠçã宿œããå¿ èŠãããããšãå€ãã§ãã
äŸãã°ããµããŒããã¯ã¿ãŒãã·ã³ã¯å€æ°ã®ã¹ã±ãŒã«ãæã£ãŠããå¿
èŠãããããã
å¹³åã0ãæšæºåå·®ã±1ãšãªãããã¹ã±ãŒã«å€æãããæšæºåããäºåå®è¡ããå¿
èŠããããŸã

ãã®ããã«ãæ©æ¢°åŠç¿ã¯
ãååŠç1 â ååŠç2 â ⥠â åŠç¿åšã
ãšãã£ãå
·åã§ãè€æ°ã®åŠçã鿬¡çã«é²ããããšãäžè¬çã§ããã
ãã®äžé£ã®åŠçããŸãšããŠå®è¡ã§ããããã«ããä»çµã¿ããã€ãã©ã€ã³ãšåŒã³ãŸãã
äŸãã°ãæšæºå(ååŠç1) â äž»æååæ(ååŠç2) â ãµããŒããã¯ã¿ãã·ã³ãã®äžé£ã®åŠçãã
æãã·ã³ãã«ãªããåŠç¿ããŒã¿ = æšè«ããŒã¿ãã§å®è¡ããå Žåã以äžã®ãããªãããŒã§åŠçãè¡ããŸã

ãã€ãã©ã€ã³åŠçã®ã·ã³ãã«ãªå®è£
åè¿°ã®ãåŠç¿ããŒã¿ = æšè«ããŒã¿ãã®äŸããå®éã«å®è£
ããŠã¿ãŸãã
ããŒã¿ã«ã¯ä»¥äžã®irisããŒã¿ã»ããã䜿çšããŸã
import seaborn as sns
iris = sns.load_dataset("iris") # irisããŒã¿ã»ããã䜿çš
features = ['petal_width', 'petal_length', 'sepal_width'] # 説æå€æ°
X = iris[features].values # 説æå€æ°ãndarrayå
y = iris['species'] # ç®ç倿°ãndarrayå
ã¹ã¯ã©ããã§å®è£
ãŸãã¯åè¿°ã®äŸã®éãããã€ãã©ã€ã³çšã®ç¹å¥ãªã¯ã©ã¹ã¯å©çšãããçŽ çŽã«å®è£ ããŠã¿ãŸã
from sklearn.pipeline import Pipeline # ãã€ãã©ã€ã³çšã¯ã©ã¹
from sklearn.preprocessing import StandardScaler # æšæºåã¯ã©ã¹
from sklearn.decomposition import PCA # äž»æååæã¯ã©ã¹
from sklearn.svm import SVC # ãµããŒããã¯ã¿ãŒãã·ã³åé¡ã¯ã©ã¹
scaler = StandardScaler()
pca = PCA(n_components=2)
svm = SVC()
scaler.fit(X) # æšæºåã®åŠç¿
X_scaler = scaler.transform(X) # æšæºåã®æšè«
pca.fit(X_scaler) # äž»æååæã®åŠç¿
X_pca = pca.transform(X_scaler) # äž»æååæã®æšè«
svm.fit(X_pca, y) # SVMã®åŠç¿
pred = svm.predict(X_pca) # SVMã®æšè«
Scikit-Learnã®PipeLineã¯ã©ã¹ã§å®è£
Scikit-Learnã«ã¯ããã€ãã©ã€ã³ãå®è£
ããããã®PipeLineã¯ã©ã¹ãååšããŸãã
ãã¡ãã䜿ã£ãŠå®è£
ããŠã¿ãŸãã
from sklearn.pipeline import Pipeline # ãã€ãã©ã€ã³çšã¯ã©ã¹
from sklearn.preprocessing import StandardScaler # æšæºåã¯ã©ã¹
from sklearn.decomposition import PCA # äž»æååæã¯ã©ã¹
from sklearn.svm import SVC # ãµããŒããã¯ã¿ãŒãã·ã³åé¡ã¯ã©ã¹
pipe = Pipeline([("scaler", StandardScaler()),
("pca", PCA(n_components=2)),
("svm", SVC())])
pipe.fit(X, y) # åŠç¿
pred = pipe.predict(X) # æšè«
ã¹ã¯ã©ããã®ãšããšæ¯ã¹ãã³ãŒããçããŸãšãŸããŸããããããã»ã©å€§ããªå·®ã§ã¯ãããŸããã
ãããåŠçã®æµããåããã«ãããªããããã ãã§ã¯ãã¡ãªããããæããŠããŸããŸãã
ãã€ãã©ã€ã³ã®ã¡ãªãã
åè¿°ã®ããã«ããåŠç¿ããŒã¿ = æšè«ããŒã¿ãã®æ¡ä»¶ã§ã¯ããã€ãã©ã€ã³ã®ã¡ãªãããæããäºãã§ããŸããã§ããã
äžæ¹ã§å®éã®æ©æ¢°åŠç¿ã«ãããŠã¯ãåŠç¿ããŒã¿ãšæšè«ããŒã¿ïŒãã¹ãããŒã¿ïŒãåããäºãå€ãã§ãã
Scikit-Learnãªã©ã®ã©ã€ãã©ãªã§ã¯ããã€ãã©ã€ã³çšã¯ã©ã¹ã¯åŠç¿ã¡ãœãããšæšè«ã¡ãœããããæ§æãããŠããã
ãããã以äžã®ããã«åäœããŸãã

èŠçŽãããš
ã»åŠç¿çšã¡ãœããã¯ãæåŸã®åŠçïŒåŠç¿åšïŒä»¥å€ã®åŠç¿ãšæšè«ãå®è¡ããæåŸã®åŠçã¯åŠç¿ã®ã¿å®è¡ãã
ã»æšè«çšã¡ãœããã¯ãå
šãŠã®åŠçã®æšè«ãé çªã«å®è¡ãã
ãšãªããŸãã
ãã®æ§æã¯ãåŠç¿ããŒã¿ãšæšè«ããŒã¿ãåããå Žåã®å®è£
ãã·ã³ãã«ã«ãªããšããã¡ãªããããããŸãã
ã©ã®ãããªããŒã¿ã®åãæ¹ãããŠãããã€ãã©ã€ã³ã®åŠç¿ã»æšè«çšã¡ãœããããããããåŠç¿åšåäœã®åŠç¿ã»æšè«çšã¡ãœããã®ããã«æ±ããããã§ãã
åŠç¿ã»æšè«ããŒã¿ãåããå Žåã®ãã€ãã©ã€ã³åŠçå®è£
äžèšã®ã¡ãªããã宿ããããã«ããã€ãã©ã€ã³çšã¯ã©ã¹ã䜿çšããå Žåãšããªãå Žåã§ã
åŠç¿ã»æšè«ããŒã¿ãåããå Žåã®å®è£
ãæ¯èŒããŠã¿ãŸã
ãã€ãã©ã€ã³çšã¯ã©ã¹ã䜿çšããªãå Žå
from sklearn.model_selection import train_test_split # ããŒã¿åå²çšã¡ãœãã
scaler = StandardScaler()
pca = PCA(n_components=2)
svm = SVC()
# åŠç¿ããŒã¿ãšæšè«ããŒã¿ã®åå²
X_train, X_test, y_train, y_test = train_test_split(X, y)
# åŠç¿ããŒã¿ã«å¯ŸããŠåŠç¿å®è¡
scaler.fit(X_train) # æšæºåã®åŠç¿
X_train_scaler = scaler.transform(X) # æšæºåã®æšè«
pca.fit(X_train_scaler) # äž»æååæã®åŠç¿
X_train_pca = pca.transform(X_train_scaler) # äž»æååæã®æšè«
svm.fit(X_train_pca, y) # SVMã®åŠç¿
# æšè«ããŒã¿ã«å¯ŸããŠæšè«å®è¡
X_test_scaler = scaler.transform(X) # æšæºåã®æšè«
X_test_pca = pca.transform(X_test_scaler) # äž»æååæã®æšè«
pred = svm.predict(X_test_pca) # SVMã®æšè«
åŠç¿ããŒã¿ãšæšè«ããŒã¿ããããã«predictã¡ãœãããé©çšããå¿
èŠãããããã
ãåŠç¿ããŒã¿=æšè«ããŒã¿ãã®ãšããšæ¯ã¹è¡æ°ãå¢ããŠããŸã
Pipelineã¯ã©ã¹ã䜿çšããå Žå
from sklearn.model_selection import train_test_split # ããŒã¿åå²çšã¡ãœãã
pipe = Pipeline([("scaler", StandardScaler()),
("pca", PCA(n_components=2)),
("svm", SVC())])
# åŠç¿ããŒã¿ãšæšè«ããŒã¿ã®åå²
X_train, X_test, y_train, y_test = train_test_split(X, y)
# åŠç¿ããŒã¿ã«å¯ŸããŠåŠç¿å®è¡
pipe.fit(X_train, y_train)
# æšè«ããŒã¿ã«å¯ŸããŠæšè«å®è¡
pred = pipe.predict(X_test)
ãåŠç¿ããŒã¿=æšè«ããŒã¿ãã®ãšããšåæ§ãåŠç¿ïŒfitã¡ãœããïŒãšæšè«ïŒpredictïŒã1è¡ãã€ã§æžãã§ãããè¡æ°ã®å¢å ãé²ããŠããŸãã
ãã®ããã«ãåŠç¿ããŒã¿ãšæšè«ããŒã¿ãåããå Žåã§ãå®è£ ãã·ã³ãã«ã«ãªããšãããã€ãã©ã€ã³ã®ã¡ãªãããã宿ããäºãåºæ¥ãŸããã
ã¯ãã¹ããªããŒã·ã§ã³ãšãã€ãã©ã€ã³
ãã€ãã©ã€ã³ãç䟡ãçºæ®ããã®ããã¯ãã¹ããªããŒã·ã§ã³ã宿œãããšãã§ãã
ã¯ãã¹ããªããŒã·ã§ã³ãšã¯ãæ©æ¢°åŠç¿ã®æ§èœè©äŸ¡ãè¡ã代衚çãªææ³ã§ã
ããŒã¿ãNçåããäžã§ã1ã€ã®ã°ã«ãŒãããã¹ãããŒã¿ãšããæ®ããåŠç¿ããŒã¿ãšããããåå²ãã
ããããã®ãã¹ãããŒã¿ããç®åºããã¹ã³ã¢ãå¹³åããŠãæçµçãªã¹ã³ã¢ãšããŸãã
ã¯ãã¹ããªããŒã·ã§ã³ã®åå²ã€ã¡ãŒãžã¯ãäžã®Wikipediaã®å³ãåãããããã§ã

ã¯ãã¹ããªããŒã·ã§ã³ã«ãããŠãããã€ãã©ã€ã³çšã¯ã©ã¹ã䜿çšããªãå Žåãšããå Žåã§ã®å®è£
ãæ¯èŒããŠã¿ãŸãã
ãã€ãã©ã€ã³çšã¯ã©ã¹ã䜿çšããªãå Žå
from sklearn.model_selection import KFold # ã¯ãã¹ããªããŒã·ã§ã³åå²çšã¯ã©ã¹
from sklearn.metrics import accuracy_score # ã¹ã³ã¢(accuracy)ç®åºçšã¯ã©ã¹
import numpy as np
scaler = StandardScaler()
pca = PCA(n_components=2)
svm = SVC()
# ã¹ã³ã¢ä¿æçšã®ãªã¹ã
scores = []
# ã¯ãã¹ããªããŒã·ã§ã³å®è¡
cv = KFold(n_splits=5, shuffle=True, random_state=42) # ã¯ãã¹ããªããŒã·ã§ã³çšã¯ã©ã¹
for train, test in cv.split(X, y):
X_train, X_test = X[train], X[test]
y_train, y_test = y[train], y[test]
# åŠç¿ããŒã¿ã«å¯ŸããŠåŠç¿å®è¡
scaler.fit(X_train) # æšæºåã®åŠç¿
X_train_scaler = scaler.transform(X) # æšæºåã®æšè«
pca.fit(X_train_scaler) # äž»æååæã®åŠç¿
X_train_pca = pca.transform(X_train_scaler) # äž»æååæã®æšè«
svm.fit(X_train_pca, y) # SVMã®åŠç¿
# æšè«ããŒã¿ã«å¯ŸããŠæšè«å®è¡
X_test_scaler = scaler.transform(X) # æšæºåã®æšè«
X_test_pca = pca.transform(X_test_scaler) # äž»æååæã®æšè«
pred = svm.predict(X_test_pca) # SVMã®æšè«
# ã¹ã³ã¢ç®åº
accuracy = accuracy_score(y, pred)
scores.append(accuracy)
# ã¹ã³ã¢ãå¹³åããŠæçµææšãšãã
score = np.mean(scores)
ããŒã¿ã®åå²ãã«ãŒãå®è¡ãšãªããã¹ã³ã¢ã®ç®åºãå ããã®ã§ãå®è£ ãããªãé·ããªããŸããã
ãã€ãã©ã€ã³çšã¯ã©ã¹ã䜿çšããå Žå
from sklearn.model_selection import KFold, cross_val_score # ã¯ãã¹ããªããŒã·ã§ã³ææšç®åºçšã¯ã©ã¹
import numpy as np
pipe = Pipeline([("scaler", StandardScaler()),
("pca", PCA(n_components=2)),
("svm", SVC())])
# ã¯ãã¹ããªããŒã·ã§ã³å®è¡
cv = KFold(n_splits=5, shuffle=True, random_state=42) # ã¯ãã¹ããªããŒã·ã§ã³çšã¯ã©ã¹
scores = cross_val_score(pipe, X, y, scoring='accuracy', cv=cv)
# ã¹ã³ã¢ãå¹³åããŠæçµææšãšãã
score = np.mean(scores)
ã¯ãã¹ããªããŒã·ã§ã³çšã®cross_val_scoreã¡ãœãããå©çšããäºã§ãããã¯ãªãããããçãå®è£
ãå®çŸã§ããŸãã
ãã®cross_val_scoreã¡ãœããã¯ãPipelineã¯ã©ã¹ãªãã§ã¯ååŠçãå«ããã¢ãã«ãæ£ããããŒã¿åå²ããäºãã§ããªãã®ã§ã
ãŸãã«ãã€ãã©ã€ã³ã®æ©æµãåãã圢ãšãªããŸãã
Scikit-Learnã®ãããªæ©æ¢°åŠç¿ã©ã€ãã©ãªã«ã¯ãcross_var_score以å€ã«ãã¯ãã¹ããªããŒã·ã§ã³ãå©çšãã䟿å©ãªã¡ãœããã倿°çšæãããŠããããã©ã¡ãŒã¿ãã¥ãŒãã³ã°ã«å©çšãããã°ãªãããµãŒãïŒGridSearchCVïŒã¯ãã®ä»£è¡šäŸã§ãã
ãã€ãã©ã€ã³ããªããã°ãååŠçãå«ãã¢ãã«ã§ã¯äžèšã®äŸ¿å©ãªã¡ãœãããå©çšããäºãã§ãããã¹ã¯ã©ããã§å€å€§ãªæéãæããŠå®è£
ããå¿
èŠããããŸãã
ãã®ãããå®çšäžã¯ååŠçãå«ããŠã¯ãã¹ããªããŒã·ã§ã³ãå©çšããããã«ã¯ããã€ãã©ã€ã³åŠçãå¿
èŠäžå¯æ¬ ãšèšããŸãã
ãŸãšã
以äžãŸãšãããšã
ãã€ãã©ã€ã³ã®æŠèŠããã³ã¡ãªããã¯ã以äžã®ããã«ãªããŸãã
ã»æ©æ¢°åŠç¿ãã€ãã©ã€ã³ã¯ãè€æ°ã®åŠçãçµåãããããã1ã€ã®åŠç¿åšã®ããã«åŠç¿ã»æšè«ãè¡ããä»çµã¿
ã»ãã€ãã©ã€ã³ã®ã¡ãªããã¯ãåŠç¿ããŒã¿ãšæšè«ããŒã¿ãåããéã«ãå®è£
ãã·ã³ãã«ã«ã§ããããš
ã»ã¯ãã¹ããªããŒã·ã§ã³å®è¡æã«ãç¹ã«å€§ããªå¹æãåŸããã
æè¿æµè¡ãã®MLOpsã«ãããŠããããã€ãã©ã€ã³ã§å¹ççã«éçºã»éçšãããïŒããšããèãæ¹ã¯æ ¹å¹¹ã®äžã€ãå ããŠããã®ã§ãèŠããŠãããŠæã¯ãªãããšæããŸãïŒ
以äžãæåŸãŸã§èªãã§é ãããããšãããããŸããïŒ