๐ Spark ML
Spark ML ์๊ฐ
-
๋จธ์ ๋ฌ๋ ๊ด๋ จ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ, ์ ํธ๋ฆฌํฐ๋ก ๊ตฌ์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Classification, Regression, Clustering, Collaborative Filtering, Dimensionality Reduction - ์ฐธ๊ณ
- ์์ง ๋ฅ๋ฌ๋์ ๋ํ ์ง์์ ๋ฏธ์ฝํ๋ค.
-
RDD ๊ธฐ๋ฐ๊ณผ DataFrame ๊ธฐ๋ฐ์ ๋ ๋ฒ์ง์ด ์กด์ฌํ๋ค.
- spark.mllib vs. spark.ml
- spark.mllib -> RDD ๊ธฐ๋ฐ
- spark.ml -> DataFrame ๊ธฐ๋ฐ
- spark.mllib๋ RDD์์์ ๋์ํ๋ ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ ์ด์ ์
๋ฐ์ดํธ๊ฐ ์๋๋ค.
- spark.ml์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค
-> import pyspark.ml
Spark ML ์ฅ์
- DataFrame๊ณผ SparkSQL๋ฑ์ ์ด์ฉํ์ฌ ์ ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค.
- Spakr MLlib๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ๋น๋ํ๋ค.
- ML Pipeline์ ํตํด ๋ชจ๋ธ ๋น๋ฉ์ ์๋ํํ๋ค.
- MLflow๋ก ๋ชจ๋ธ์ ๊ด๋ฆฌํ๊ณ ์๋นํ๋ค.
- ๋์ฉ๋ ๋ฐ์ดํฐ๋ ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค.
MLflow
- ๋ชจ๋ธ์ ๊ด๋ฆฌ์ ์๋น์ ์ํ Ops ๊ด๋ จ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค.
- MLflow
- ๋ชจ๋ธ ๊ฐ๋ฐ, ํ
์คํธ, ๊ด๋ฆฌ ๊ทธ๋ฆฌ๊ณ ์๋น๊น์ง ์ ๊ณตํด์ฃผ๋ End-to-End Framwork์ด๋ค.
- MLflow๋ Python, Java, R, API๋ฅผ ์ง์ํ๋ค.
- MLflow๋ Tracking, Models, Projects๋ฅผ ์ง์ํ๋ค.
Spark ML์์ ์ ๊ณตํ๋ ์๊ณ ๋ฆฌ์ฆ
-
Classification(๋ถ๋ฅ)
-> Logistic regression, Decision tree, Random forest, Gradient-boosted tree, ...
-> ๋ ์ด๋ธ(Lable)์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์
์ ๊ฐ์ ธ์ ํด๋น ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ฐ์ดํฐ์ ๋ ์ด๋ธ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ํ์ตํ๋ ๊ฐ๋
ํ์ต ๊ธฐ๋ฒ์ด๋ค. Yes & No ์ ๊ฐ์ด ๋ถ๋ฅ์ ๋ํ ๋ฌธ์ ๋ฅผ ๋ค๋ฃฌ๋ค.
-
Collaborative Filtering(ํ์
ํํฐ๋ง)
- ๊ถ์ฅ ์ฌํญ์ ๋ง๋๋ ๊ธฐ์ ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ผํ ์น ์ฌ์ดํธ์ "์ข์ํ ์ ๋ ์๋.." ๋ฑ๋ฑ์ ํํ๋ก ํ๊ธฐ๋๋๊ฒ์ด ์ด๊ฒ์ด๋ค.
- ๋ค์์ ๋ฐ์ดํฐ ๊ด์ธก์ ์ฒ๋ฆฌํ์ฌ ์ ์ฌํ ํน์ฑ์ด๋ ํน์ง์ ๊ฐ์ง ์ํฐํฐ๋ฅผ ์ฐพ์๋ค์ ์ด์ ๊ด์ธก์ ๋ฐ๋ผ ์๋ก ๊ด์ฐฐ๋ ์ํฐํฐ์ ๊ถ์ฅ ์ฌํญ ๋๋ ์ ์์ ํ๋ ๊ฒ์ด๋ค.
- ๋ถ๋ฅ์ ๋ฌ๋ฆฌ ๋น๊ฐ๋
ํ์ต ๊ธฐ๋ฒ์ด๋ค. ์ด๋ ๋ ์ด๋ธ(Lable)์์ด ๋ฐ์ดํฐ์ ํจํด์ ๋์ถํ ์ ์์์ ์๋ฏธํ๋ค.
-
Clustering(ํด๋ฌ์คํฐ๋ง)
-> K-means, LDA, GMM...
- ๋ฐ์ดํฐ ๊ด์ธก ์์ง ๋ด์์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊ฒฌํ๋ ํ๋ก์ธ์ค์ด๋ค.
- ํ์ & ๊ตฌ์กฐ๊ฐ ๋ช
ํํ์ง ์์ ๊ฒฝ์ฐ ๋์ฑ ์ ์ฉํ๋ค.
- ์ ๊ณต๋ ๋ฐ์ดํฐ์์ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ์ํ๋ ๊ทธ๋ฃน์ ๋ฐ๊ฒฌํ๋ค.
๐ ๋ชจ๋ธ ๋น๋ฉ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
๐ Spark ML ํผ์ณ ๋ณํ
-
Feature๊ฐ๋ค์ ๋ชจ๋ธ ํ๋ จ์ ์ ํฉํ ํํ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์ง์นญํ๋ค.
-
Feature Transformer๊ฐ ํ๋ ์ผ
- ๋จผ์ Feature๊ฐ๋ค์ ์ซ์ ํ๋์ฌ์ผ ํ๋ค.
-> ํ
์คํธ ํ๋(์นดํ
๊ณ ๋ฆฌ ๊ฐ๋ค)๋ฅผ ์ซ์ ํ๋๋ก ๋ณํํด์ผํ๋ค.
- ์ซ์ ํ๋ ๊ฐ์ ๋ฒ์๋ฅผ ํ์คํํ๋ค.
- ์ซ์ํ๋๋ผ๊ณ ํด๋ ๊ฐ๋ฅํ ๊ฐ์ ๋ฒ์๋ฅผ ํน์ ๋ฒ์(0~1)๋ก ๋ณํํด์ผํ๋ค.
- ์ด๋ฅผ Feature Scaling & Normalization์ด๋ผ๊ณ ํ๋ค.
- ๋น์ด์๋ ํ๋๋ค์ ๊ฐ์ ์ด๋ป๊ฒ ์ฑ์ธ ๊ฒ์ธ๊ฐ?
-> ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ์ฑ์ธ ์ ์๋ค. ํ๊ท ๊ฐ, ์ต๋๊ฐ, ์ต์๊ฐ ๋ฑ๋ฑ
-
Feature Extractor๊ฐ ํ๋ ์ผ
- ๊ธฐ์กด Feature์์ ์๋ก์ด Feature๋ฅผ ์ถ์ถํ๋ค.
- TF-IDF, Word2Vec, ...
-> ๋ง์ ๊ฒฝ์ฐ ํ
์คํธ ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ํํ๋ก ์ธ์ฝ๋ฉํ๋ ๊ฒ์ด ์ฌ๊ธฐ์ ํด๋นํ๋ค.
- ํ
์คํธ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ์ซ์๋ก ๋ณํ
- ์๋ ์ผ์ชฝ๊ณผ ๊ฐ์ ๊ฐ์ ๊ฐ๋ Color๋ผ๋ ์ด๋ฆ์ Feature๊ฐ ์กด์ฌํ๋ค๋ฉด ์ด๋ฅผ ์ซ์๋ก ๋ณํํด์ฃผ๋ ๊ฒ์ด Feature Trasformer์ ๋ชฉ์ ์ด๋ค.
| ๋ณํ ์ | ๋ณํ ํ |
|---|
| Red | 1 |
| Blue | 2 |
| Orange | 3 |
| White | 4 |
| Black | 5 |
| Gray | 6 |
| Yellow | 7 |
-
Scikit-Learn์ sklearn.preprocessing ๋ชจ๋ ์๋ ์ฌ๋ฌ ์ธ์ฝ๋๊ฐ ์กด์ฌํ๋ค.
-> OneHotEncoder, Labelencoder, OrdianlEncoder, ...
-
Spark MLlib์ ๊ฒฝ์ฐ pyspark.ml.feature ๋ชจ๋ ์๋ ๋ ๊ฐ์ ์ธ์ฝ๋๊ฐ ์กด์ฌํ๋ค.
- StringIndexer, OneHotEncoder
- ์ฌ์ฉ๋ฒ์ Indexer ๋ชจ๋ธ์ ๋ง๋ค๊ณ (Fit), Indexer ๋ชจ๋ธ๋ก ๋ฐ์ดํฐํ๋ ์์ ๋ณํ(Transform)
from pyspark.ml.feature import StringIndexer
gender_indexer = StringIndexer(inputCol='Gender', outputCol='GenderIndexed')
gender_indexer_model = gender_indexer.fit(final_data)
final_data_with_transformed_gender_gender = gender_indexer_model.transform(final_data)
- ์ซ์ ํ๋๊ฐ์ ๋ฒ์๋ฅผ ํ์คํ
- ์ซ์ ํ๋ ๊ฐ์ ๋ฒ์๋ฅผ ํน์ ๋ฒ์(0~1)๋ก ๋ณํ ํ๋ ๊ฒ์ด๋ค.
- Feature Scaling & Normalization์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
| ๋ณํ ์ | ๋ณํ ํ |
|---|
| -20 | 0 |
| 100 | 1 |
| 40 | 0.5 |
| 25 | 0.375 |
| 15 | 0.125 |
-
Scikit-Learn์ sklearn.preprocessing ๋ชจ๋ ์๋ ๋ ๊ฐ์ ์ค์ผ์ผ๋ฌ๊ฐ ์กด์ฌํ๋ค.
-> StandardScaler, MinMaxScaler
-
Spark MLlib์ ๊ฒฝ์ฐ pyspark.ml.feature ๋ชจ๋ ์๋ ๋ ๊ฐ์ ์ค์ผ์ผ๋ฌ๊ฐ ์กด์ฌํ๋ค.
- StandardScaler, MinMaxScaler
- ์ฌ์ฉ๋ฒ์ Scaler ๋ชจ๋ธ์ ๋ง๋ ํ (fit), Scaler ๋ชจ๋ธ๋ก DataFrame์ ๋ณํ(Transform)
-
StandardScler
-> ๊ฐ ๊ฐ์์ ํ๊ท ์ ๋นผ๊ณ ์ด๋ฅผ ํ์คํธ์ฐจ๋ก ๋๋๋ค. ๊ฐ์ ๋ถํฌ๊ฐ ์ ๊ท๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
-
MinMaxScaler
-> ๋ชจ๋ ๊ฐ์ 0๊ณผ 1์ฌ์ด๋ก ์ค์ผ์ผํ๋ค. ๊ฐ ๊ฐ์์ ์ต์๊ฐ์ ๋นผ๊ณ (์ต๋๊ฐ-์ต์๊ฐ)์ผ๋ก ๋๋๋ค.
- ๊ฐ์ด ์๋ ํ๋ ์ฑ์ฐ๊ธฐ
- ๊ฐ์ด ์กด์ฌํ์ง ์๋ ๋ ์ฝ๋๋ค์ด ์กด์ฌํ๋ ํ๋๋ค์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ ์ ํด์ ์ฑ์ฐ๋ ๊ฒ์ด๋ค. -> Imputeํ๋ค. ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
| ๋ณํ ์ | ๋ณํ ํ |
|---|
| 10 | 10 |
| 25 |
| 20 | 20 |
| 30 | 30 |
| 40 | 40 |
from pyspark.ml.feature import Imputer
imputer = Imputer(strategy='mean', imputCols=['Age'], outputCols=['Agelmputed'])
imputer_model = imputer.fit(final_data)
final_data_age_transformed = imputer_model.transform(final_data)