본문 바로가기

데이터 분석

Spark - Linear Regression

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



실험 내용


Spark MLlib의 Linear Regression 알고리즘을 이용하여 최적의 모델 생성


이를, 이용하여 결과 예측


MLlib 보다 Ml 사용을 권장하는 것 같지만 데이터가 많을 경우 빠르게 처리하기 위해 MLlib 사용





  


[ 변수 수에 따른 간략 예시 ]








샘플 데이터


5,1 1 2 1

10,2 2 4 2

15,3 4 6 3

21,4 4 8 4

25,5 5 10 5

30,6 6 12 6

35,7 7 14 7

40,8 8 16 8

45,9 9 18 9

50,10 10 20 10

56,11 13 22 11

59,12 12 24 12







데이터 설명


▶ 결과 Label, 특성 Features


▶ 테스트라는 점을 감안하여 예로,


데이터 값의 합이 일정한 비율로 증가 되도록 작성하였다.


▶ 다른 데이터들도 동일함

 






Source


       ■ 데이터 양이 적어 1000번( int numIterations = 1000 ) 반복


       ■ StepSize를 0.1, 0.01, 0.001로 3회 실행하여


       ■ 최소값인 Mean Squared Error 확인


       ■ 이는 실제 데이터와 얼마나 차이 나는가?  뜻임


        SparkConf sconf = new SparkConf().setMaster("local[2]").setAppName("odinDataServer").set("spark.ui.port", "4048");
        JavaSparkContext sc = new JavaSparkContext(sconf);   


       

        String path = "/home/ksu/sample_data/abc.txt";

        JavaRDD<String> data = sc.textFile(path);


        JavaRDD<LabeledPoint> parsedData = data.map(
          new Function<String, LabeledPoint>() {
            public LabeledPoint call(String line) {
              String[] parts = line.split(",");
              String[] features = parts[1].split(" ");
              double[] v = new double[features.length];
              for (int i = 0; i < features.length - 1; i++) {
                v[i] = Double.parseDouble(features[i]);
              }
              return new LabeledPoint(Double.parseDouble(parts[0]), Vectors.dense(v));
            }
          }
        );
        parsedData.cache();




        int numIterations = 1000;
        double StepSize = 0.1 과 0.01 과 0.001로 진행했음;



        final LinearRegressionModel model =
          LinearRegressionWithSGD.train(JavaRDD.toRDD(parsedData), numIterations, StepSize);
       
      
        JavaRDD<Tuple2<Double, Double>> valuesAndPreds = parsedData.map(
          new Function<LabeledPoint, Tuple2<Double, Double>>() {
            public Tuple2<Double, Double> call(LabeledPoint point) {
              double prediction = model.predict(point.features());
              return new Tuple2<>(prediction, point.label());
            }
          }
        );
               
        double MSE = new JavaDoubleRDD(valuesAndPreds.map(
          new Function<Tuple2<Double, Double>, Object>() {
            public Object call(Tuple2<Double, Double> pair) {
              return Math.pow(pair._1() - pair._2(), 2.0);
            }
          }
        ).rdd()).mean();


        System.out.println("training Mean Squared Error = " + MSE);

 






결과


0.1 StepSize     모델 => training Mean Squared Error = 2.721774988774932E149

0.01 StepSize   모델 => training Mean Squared Error = 0.22500840207926065  (가장 좋음)

0.001 StepSize 모델 => training Mean Squared Error = 0.6558090339038074

 







  생성된 모델로 예측을 진행하면



System.out.println( model.predict( Vectors.dense( new double[]{20,20,20,40} ) ) );


생성한 모델에 위의 값을 넣으면 얼마가 될까?


▶ 콘솔 내용 : 99.43031001646277


100에서 쬐끔 차이남

 













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

Spark - Random Forest Regression  (0) 2017.05.24
Spark - Random Forest Classification  (3) 2017.05.23
MSE, RMSE  (0) 2017.05.19
Spark - Naive Bayes (단어를 이용한 문서 구별)  (0) 2017.05.12
mahout - 설치 및 User 기준 추천  (0) 2017.05.11