Post

[Spark] MLlib

[Spark] MLlib

๐Ÿ“Œ MLlib์ด๋ž€?

Spark MLlib ์€ ๋น…๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ ๋ถ„์‚ฐ ๋จธ์‹ ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. scikit-learn ๊ณผ ๊ฐ™์ด ๋‹จ์ผ ๋จธ์‹ ์—์„œ ๋™์ž‘ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•˜์˜€๋‹ค.

ํŠน์ง•

  • MLlib์— ๊ตฌํ˜„๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ๋Œ€๊ทœ๋ชจ ๋ณ‘๋Ÿด ์ฒ˜๋ฆฌ์— ๋งž๊ฒŒ ์„ค๊ณ„๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณด๋‹ค ๋†’์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค€๋‹ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ์— ๋” ๋งŽ์€ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ˆ˜ํ‰์  ํ™•์žฅ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜์—ฌ๋„ ๊ฑฐ์˜ ์„ ํ˜•์ ์ธ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฑฐ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ์…‹์„ ์—ฌ๋Ÿฌ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ ๋…ธ๋“œ์— ๋ถ„์‚ฐ์‹œํ‚จ๋‹ค. ๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹ ์ด ๋งก์€ ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•ด์„œ๋งŒ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•˜๊ณ , ํ•„์š” ์‹œ ๋‹ค๋ฅธ ๋…ธ๋“œ์™€ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.
  • ๋จธ์‹ ๋Ÿฌ๋‹์˜ ์ „์ฒด ํŒŒ์ดํ”„์‚ฌ์ดํด์„ ์ŠคํŒŒํฌ ํ”„๋ ˆ์ž„์›Œํฌ ์•ˆ์—์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋จธ์‹ ๋Ÿฌ๋‹ ๋กœ์ง ์ž์ฒด์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ณ ์ˆ˜์ค€ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ

  • Logistic Regression, Principal Component Analysis ๋“ฑ๊ณผ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์กด์žฌํ•œ๋‹ค.
  • OneHotEndocer, StandardScaler ๋“ฑ๊ณผ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ํ”ผ์ฒ˜ ์—”์ง€๋‹ˆ์–ด๋ง ๋„๊ตฌ๋“ค์ด ์กด์žฌํ•œ๋‹ค.
  • ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๋ฌถ๋Š” ํŒŒ์ดํ”„๋ผ์ธ์ด ์žˆ๋‹ค.
  • ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์„ ๋””์Šคํฌ์— ์ €์žฅํ•˜๊ณ  ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.
  • RMSE, R-squared์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ํ‰๊ฐ€ ์ง€ํ‘œ๊ฐ€ ์žˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜

๋‘ ๊ฐ€์ง€ API๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, RDD ๊ธฐ๋ฐ˜๊ณผ DataFrame ๊ธฐ๋ฐ˜์ด๋‹ค.

RDD ๊ธฐ๋ฐ˜ API(spark.mllib)์€ ํ˜„์žฌ drprecated์ด๋‹ค. RDD๋Š” ๋ฐ์ดํ„ฐ์— ์ปฌ๋Ÿผ ์ด๋ฆ„์ด ์—†์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๋‚˜ ๋‚ด์šฉ์„ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ–ˆ๊ณ , ๋งŽ์€ ๋ถˆํŽธํ•จ์ด ์ƒ๊ฒผ๋‹ค. ๋˜ํ•œ ํŒŒ์ดํ”„๋ผ์ธ API๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„ ํ”ผ์ฒ˜ ์—”์ง€๋‹ˆ์–ด๋ง, ๋ชจ๋ธ ํ›ˆ๋ จ, ํ‰๊ฐ€ ๋“ฑ์˜ ๊ณผ์ •์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ด์•ผ ํ–ˆ๋‹ค.

์ŠคํŒŒํฌ๊ฐ€ ๋ฐœ์ „ํ•˜๋ฉด์„œ DataFrame์ด ๋„์ž…๋˜์—ˆ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ DataFrame ๊ธฐ๋ฐ˜ API(spark.ml)๊ฐ€ ๋“ฑ์žฅํ•˜์˜€๋‹ค. ๊ฐ€์žฅ ๋šœ๋ ทํ•œ ์ฐจ์ด์ ์€ ํŒŒ์ดํ”„๋ผ์ธ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ๋ชจ๋“  ์ผ๋ จ์˜ ๋จธ์‹ ๋Ÿฌ๋‹ ๋‹จ๊ณ„๋ฅผ ํ•˜๋‚˜์˜ ํŒŒ์ดํ”„๋ผ์ธ ๊ฐ์ฒด๋กœ ๋ฌถ์–ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ Spark SQL, Structured Streaming ๋“ฑ ๋‹ค๋ฅธ ์ŠคํŒŒํฌ ์ปดํฌ๋„ŒํŠธ์™€ ์—ฐ๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์žฅ์ ๊ณผ ํ•œ๊ณ„

๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๋ถ„์‚ฐ์‹œ์ผœ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™•์žฅ์„ฑ์ด ๋งค์šฐ ์ข‹๋‹ค. ๋˜ํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ณผ ETL, ํ›ˆ๋ จ, ์˜ˆ์ธก๊นŒ์ง€์˜ ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์„ ์ŠคํŒŒํฌ๋ผ๋Š” ํ•˜๋‚˜์˜ ํ”„๋ ˆ์ž„์›Œํฌ ์•ˆ์—์„œ ๋๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ๋ถ„์„์— ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์–‘ํ•œ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜์—ฌ ์œ ์—ฐ์„ฑ์ด ์ข‹๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ scikit-learn ์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ˆ˜๊ฐ€ ์ ์œผ๋ฉฐ, ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ์ง์ ‘ ์„ค๊ณ„ํ•˜๊ณ  ํ›ˆ๋ จํ•˜๊ธฐ ์œ„ํ•œ ํฌ๊ด„์ ์ธ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ชจ๋“  ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์ด ๊ทธ๋ ‡๋“ฏ์ด, ๋””๋ฒ„๊น…์ด ์–ด๋ ต๋‹ค.

Linear Regression

์„ ํ˜• ํšŒ๊ท€๋ฅผ ํ†ตํ•ด MLlib์„ ์‚ฌ์šฉํ•œ ์ „์ฒด์ ์ธ ๋จธ์‹ ๋Ÿฌ๋‹ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž.

1
2
df = spark.read.format("libsvm")\
    .load("file:///home/jovyan/work/sample/sample_linear_regression_data.txt")

libsvm ์€ ํ”ผ์ฒ˜๊ฐ€ ๋งค์šฐ ๋งŽ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ’์ด 0์ธ ํฌ์†Œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜๋‹ค. ์ž๋™์œผ๋กœ Double ํƒ€์ž…์˜ label ๊ณผ Vector ํƒ€์ž…์˜ features ์ปฌ๋Ÿผ์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ์ƒ์„ฑํ•œ๋‹ค.

1
2
3
4
5
6
7
8
lr = LinearRegression(
    featuresCol='features',
    labelCol='label',
    predictionCol='prediction',
    maxIter=10,
    regParam=0.3,
    elasticNetParam=0.8
)

์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด Estimator๋ฅผ ์ •์˜ํ•œ๋‹ค.

maxIter ๋Š” ์ตœ์ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ตœ๋Œ€ ๋ฐ˜๋ณต ํšŸ์ˆ˜์ด๋‹ค.

elasticNetParam ์€ Elastic Net ์ •๊ทœํ™”์˜ ํ˜ผํ•ฉ ๋น„์œจ์„ ๊ฒฐ์ •ํ•œ๋‹ค. ์„ค์ •๋˜๋Š” ๊ฐ’์€ L1 ์ •๊ทœํ™”์˜ ๋น„์œจ์ด๋‹ค. ์ฆ‰, ์—ฌ๊ธฐ์„œ๋Š” L1์˜ ๋น„์ค‘์„ 80%, L2์˜ ๋น„์ค‘์„ 20%๋กœ ๋‘”๋‹ค.

1
lr_model = lr.fit(training)

fit ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์‹ค์ œ๋กœ ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•œ๋‹ค.

1
2
3
test_result = lr_model.evaluate(test)

test_result.residuals.show()

evaluate ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

evaluate ๋ฉ”์„œ๋“œ์˜ ๋ฆฌํ„ด ๊ฐ’์€ Summary ๊ฐ์ฒด์ด๊ณ , ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

1
2
3
print(f"coefficients: {lr_model.coefficients}\n")

print(f"intercept: {lr_model.intercept}\n")

๋ชจ๋ธ ๊ฐ์ฒด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง์ ‘ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” coefficients ์™€ intercept ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

1
2
predictions = lr_model.transform(test)
predictions.show()

๋ชจ๋ธ ๊ฐ์ฒด๋Š” Transformer ๋กœ, transform ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์˜ˆ์ธก์„ ์ˆ˜ํ–‰ํ•˜๊ณ  prediction ์ปฌ๋Ÿผ์ด ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ์ƒ์„ฑํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
asbl = VectorAssembler(
        inputCols=[
        'avg_session',
         'time_on_app',
         'time_on_website',
         'membership_period'],
        outputCol='feature_vectors')

tr_data = asbl.transform(df)

VectorAssembler ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ˆซ์ž ์ปฌ๋Ÿผ๋“ค์„ ํ•˜๋‚˜์˜ ํ”ผ์ฒ˜ ๋ฒกํ„ฐ ์ปฌ๋Ÿผ์œผ๋กœ ํ•ฉ์น˜๋Š” transformer์ด๋‹ค. MLlib์˜ ๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‘ ๊ฐœ์˜ ์ปฌ๋Ÿผ์„ ๊ธฐ๋Œ€ํ•˜๋Š”๋ฐ, label ์ปฌ๋Ÿผ๊ณผ features ์ปฌ๋Ÿผ์ด๋‹ค. features ์ปฌ๋Ÿผ์—๋Š” ์˜ˆ์ธก์— ์‚ฌ์šฉ๋  ๋ชจ๋“  ๋…๋ฆฝ ๋ณ€์ˆ˜๋“ค์„ ๋‹ด๊ณ  ์žˆ๋Š” ํ•˜๋‚˜์˜ Vector ํƒ€์ž… ์ปฌ๋Ÿผ์ด์–ด์•ผ ํ•œ๋‹ค.

inputCols ์— ๋ฒกํ„ฐ๋กœ ํ•ฉ์น˜๊ณ  ์‹ถ์€ ์ž…๋ ฅ ์ปฌ๋Ÿผ๋“ค์˜ ๋ชฉ๋ก์„ ์ง€์ •ํ•œ๋‹ค. outputCol ์€ ์ƒˆ๋กœ ์ƒ์„ฑ๋  ๋ฒกํ„ฐ ์ปฌ๋Ÿผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.

Alternating Least Square (ALS)

Alternating Least Square ์€ ์ถ”์ฒœ ์‹œ์Šคํ…œ์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ALS๋Š” Collaborative FIltering ์ด๋ผ๋Š” ์ถ”์ฒœ ๊ธฐ๋ฒ•์„ ๊ตฌํ˜„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๋ฐ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์„ ํ˜ธ ์•„์ดํ…œ์„ ํ†ตํ•ด ๋‚˜์˜ ์ถ”์ฒœ ์•„์ดํ…œ์„ ์˜ˆ์ธกํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

1
2
3
4
5
6
7
8
9
als = ALS(
    maxIter=5,
    regParam=0.01,
    userCol="user_id",
    itemCol="movie_id",
    ratingCol="rating",
    coldStartStrategy="drop",
    nonnegative=True
)

coldStartStrategy ์—๋Š” ์ฝœ๋“œ ์Šคํƒ€ํŠธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ์ „๋žต์„ ์ •์˜ํ•œ๋‹ค. ์ฝœ๋“œ ์Šคํƒ€ํŠธ๋Š” ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์˜ˆ์ธกํ•  ๋•Œ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์—๋Š” ์—†์—ˆ๋˜ ์ƒˆ๋กœ์šด ์•„์ดํ…œ์ด ๋“ฑ์žฅํ•˜๋Š” ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค. drop ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น ํ–‰์„ ๊ฒฐ๊ณผ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค. nan ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์˜ˆ์ธก ๊ฐ’์„ NaN ๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.

nonnegative ๋Š” ๋ฒกํ„ฐ์˜ ๋ชจ๋“  ๊ฐ’์ด ์Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋„๋ก ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.

1
2
userRecs = model.recommendForAllUsers(10)
userRecs.show()

recommendForAllUsers ์€ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜๋ฅผ ๊ฐ€์ง„ N๊ฐœ์˜ ์•„์ดํ…œ์„ ์ถ”์ฒœํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

1
2
3
4
5
evaluator = RegressionEvaluator(
                metricName="rmse",
                labelCol="rating",
                predictionCol="prediction")
rmse = evaluator.evaluate(predictions)

์ด์ „์—๋Š” ๋‹จ์ˆœํžˆ evaluate ๋ฉ”์„œ๋“œ๋งŒ ํ˜ธ์ถœํ•˜์˜€์ง€๋งŒ, ์ด ๋˜ํ•œ ๋‚ด๋ถ€์ ์œผ๋กœ RegressionEvaluator ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
param_grid = ParamGridBuilder() \
    .addGrid(als.rank, [10, 100]) \
    .addGrid(als.regParam, [.1]) \
    .addGrid(als.maxIter, [10]) \
    .build()
    
cv = CrossValidator(
        estimator=als,
        estimatorParamMaps=param_grid,
        evaluator=evaluator,
        numFolds=3,
        parallelism=6)

์ด์ „์—๋Š” ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž„์˜๋กœ ๊ฒฐ์ •ํ•ด์„œ ๋„ฃ์—ˆ๋‹ค๋ฉด, ParamGridBuilder ์™€ CrossValidator ๋ฅผ ํ†ตํ•ด ์ตœ์ ์˜ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํ•ฉ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

ParamGridBuilder ๋Š” ํ…Œ์ŠคํŠธํ•  ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๋Š” ๋นŒ๋” ๋„๊ตฌ์ด๋‹ค. addGrid ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธํ•  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. build ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ์„ค์ •ํ•œ ๋ชจ๋“  ๊ทธ๋ฆฌ๋“œ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํ•ฉ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

CrossValidator ๋Š” ParamGridBuilder ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ตœ์ ์˜ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฐพ๋Š”๋‹ค. estimator ์˜ต์…˜์„ ํ†ตํ•ด ํŠœ๋‹ํ•  ๋Œ€์ƒ์„ ์ง€์ •ํ•œ๋‹ค. estimatorParamMaps ์— ํ…Œ์ŠคํŠธํ•  ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ณ , evaluator ์— ๊ธฐ์ค€์„ ์„ค์ •ํ•œ๋‹ค. numFolds ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด K-Fold Cross Validation ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉฐ, ์„ค์ •๋œ ๊ฐ’์ด k์ด๋‹ค. parallelism ์€ ๋ช‡ ๊ฐœ์˜ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰ํ• ์ง€ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. ํ˜„์žฌ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์กฐํ•ฉ์€ 2๊ฐœ์ด๊ณ , k๋Š” 3์ด๋ฏ€๋กœ ์ด 6๊ฐœ์˜ ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•ด์•ผ ํ•œ๋‹ค. parallelism ์„ 6์œผ๋กœ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ 1๊ฐœ์˜ ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๋Š” ์‹œ๊ฐ„๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

1
2
3
best_model = model.bestModel

predictions = best_model.transform(test)

bestModel ์†์„ฑ์„ ํ†ตํ•ด ๊ฐ€์žฅ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์ธ ๋ชจ๋ธ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
print(f"Rank = {best_model._java_obj.parent().getRank()}")

print(f"MaxIter = {best_model._java_obj.parent().getMaxIter()}")

print(f"RegParam = {best_model._java_obj.parent().getRegParam()}")

rank ๋Š” ์ตœ์ ์˜ ๋ชจ๋ธ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋œ ์ž ์žฌ ์š”์ธ์˜ ์ˆ˜์ด๋‹ค.

์—ฌ๊ธฐ์„œ best_model ์€ Transformer์ธ๋ฐ, rank, maxIter ์™€ ๊ฐ™์€ ์†์„ฑ์€ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•œ Estimator์˜ ์†์„ฑ์ด๋‹ค. Transformer์˜ parent ์†์„ฑ์€ Estimator ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ, ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑ๋œ ๊ฒƒ์ด๋‹ค.

This post is licensed under CC BY 4.0 by the author.