본문 바로가기

데이터 분석

Spark - ML Pipelines

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



내용


 Spark Doc 의 샘플 소스를 참고하여 Pipelines를 이용해 예측모델을 생성하고


 이를, 통해서 결과를 확인해 보자.

 




사용법


              


▶Pipieline은 일련의 Transformer와 Estimator 객체를 나타내며, 이 일련의 객체를 하나의 입력 SchemaRDD에 순차적으로 적용하여 하나의 Model을 출력


▶산출물이 Model이기 때문에 Pipeline은 그 자체로 Estimator이기도 하다.







위의 그림에서 Tokenizer, HashingTF, Logistic Regression Model이 뭔지 모르는 분들을 위해


 Tokenizer는 간단히 말하자면 문장이나 글을 띄워 쓰기 단위로 단어로 분리하는 것으로 생각하면 되고,



 HashingTF각 문장에서 단어가 등장하는 빈도를 해쉬값으로 변환하는 것으로,


      (참고1) TF: 하나의 문서에서 단어가 등장하는 빈도

      (참고2) HashingTF: 문서로부터 주어진 길이의 TF를 계산

                                  각 단어의 해쉬값을 주어진 벡터크기로 나누고,나머지 값에 해당되는 곳에 매핑



 Logistic Regression Model로지스틱 회귀로 독립 변수의 선형 결합을 이용하여 사건의 발생 가능성을 예측하는데 사용되는 통계 기법 모델이다.

 







이제 Pipieline로 모델을 만들어 보자.


그전에 샘플이 필요하다. 샘플을 만드는데 데이터 내용스키마 가 필요하다.


이 말은 뭐냐!


어떤 샘플 데이터들이 1)고유 문서 아이디, 2)내용, 3)문서 종류 로 표현된다면 학습시킬 데이터는 아래처럼 만들 수 있다.



Training 데이터


        문서종류는 문장에 "테스트"라는 단어가 들어가면 1.0종류문서 없으면 0.0종류문서로 구분하였고


        그리고 첫번째 내용인 0L, 1L .. 은       1)고유 문서 아이디 id를 표현하고 Long 타입이며


        두번째는       2)내용 문장으로 String타입이라고 명시하였으며 다음도 비슷하다


        List<Row> dataTraining = Arrays.asList(
                RowFactory.create(0L, "안녕하세요 테스트 입니다", 1.0),    
                RowFactory.create(1L, "결과가 맞게 나올까요", 0.0),
                RowFactory.create(2L, "샘플을 만드는 저도 궁금하군요", 0.0),
                RowFactory.create(3L, "테스트 데이터를 만들고 있습니다.", 1.0)
        );
       
       
        StructType train_schema = new StructType(new StructField[]{
                new StructField("id", DataTypes.LongType, false, Metadata.empty()),
                new StructField("text", DataTypes.StringType, false, Metadata.empty()),
                new StructField("label", DataTypes.DoubleType, false, Metadata.empty())
        });


        Dataset<Row> training = spark.createDataFrame(dataTraining, train_schema);








이제 테스트 데이터를 만들어 보자.



Test 데이터


           테스트 데이터는 Training 데이터와 비교하여 3)문서 종류에 대한 정보가 없다. 이는 나중에 모델을 생성하여 예측하게 된다.

        

           생성한 예제는 아래와 같다.

 

           List<Row> dataTest = Arrays.asList(
                   RowFactory.create(4L, "이제 테스트 시작해 봅시다"),    
                   RowFactory.create(5L, "샘플 문장을 작성하여 넣고 있습니다"),
                   RowFactory.create(6L, "될지 걱정이 되는 군요"),
                   RowFactory.create(7L, "테스트 결과가 뿅하고 잘 나오겠죠")
           );
           StructType test_schema = new StructType(new StructField[]{
                   new StructField("id", DataTypes.LongType, false, Metadata.empty()),
                   new StructField("text", DataTypes.StringType, false, Metadata.empty())
           });


           Dataset<Row> test = spark.createDataFrame(dataTest, test_schema);








모델을 만들어 보자.


맨 처음 나오는 그림과 동일한 방법으로 Pipeline을 만들어 보자.



                [1번단계]

                샘플은 id, text, label 이란 구조로 되어 있고 아래의 내용은


                이 데이터에서 text라는 내용을 선택하여 띄워 쓰기 구분으로 단어로 자르고 이를 words라는 컬럼에 담는다.


                Tokenizer tokenizer = new Tokenizer()
                  .setInputCol("text")
                  .setOutputCol("words");





                [2번단계]

                단어 발생 빈도를 헤쉬값으로 나타내는데 Tokenizer의 결과를 넣어서 결과를 features라는 컬럼에 담는다.


                HashingTF hashingTF = new HashingTF()
                  .setNumFeatures(1000)
                  .setInputCol(tokenizer.getOutputCol())
                  .setOutputCol("features");





                [3번단계]

                알고리즘으로 로지스틱 회귀를 사용하겠다.

                LogisticRegression lr = new LogisticRegression()
                  .setMaxIter(10)
                  .setRegParam(0.001);






                [1번-2번-3번 과정을 연결]

                Pipeline pipeline = new Pipeline()
                  .setStages(new PipelineStage[] {tokenizer, hashingTF, lr});

 




                [1번-2번-3번 과정을 연결한 Pipeline에 Training Data를 넣어서 모델 생성]

                PipelineModel model = pipeline.fit(training);

 


                모델이 생성되었다.








이제 예측을 진행해 보자.


과연 문장에 "테스트"라는 단어가 있으면 1.0으로 구분 할 것인가?



               테스트 데이터를 모델에 넣고 결과를 predictions에 담는다.         

 

               Dataset<Row> predictions = model.transform(test);

 







결과를 출력해 보면



(4, 이제 테스트 시작해 봅시다) prediction=1.0
(5, 샘플 문장을 작성하여 넣고 있습니다)  prediction=0.0
(6, 될지 걱정이 되는 군요)  prediction=0.0
(7, 테스트 결과가 뿅하고 잘 나오겠죠)  prediction=1.0

 







위와 같은 결과를 얻을 수 있고


처음 예상한데로 "테스트"라는 단어가 있는 문장은 1.0으로 예상하였다.











'데이터 분석' 카테고리의 다른 글

Spark - Correlations (1)  (0) 2017.06.21
Discrete Cosine Transform  (1) 2017.06.21
Spark - Multilayer perceptron classifier  (0) 2017.05.24
Spark - Random Forest Regression  (0) 2017.05.24
Spark - Random Forest Classification  (3) 2017.05.23