오늘보다 더 나은 내일의 나에게_

비전공자의 IoT 국비 교육 수강일지 Day_79 본문

비전공자의 코딩일지

비전공자의 IoT 국비 교육 수강일지 Day_79

chan_96 2022. 4. 11. 17:55
728x90

머신러닝(Machine Learning)

머신러닝이란?

- 데이터를 기반으로 학습을 시켜서 예측하게 만드는 기법

- 인공지능의 한 분야로 컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야

- 통계학, 데이터 마이닝, 컴퓨터 과학이 어우러진 분야

 

Rule-based expert system(규칙 기반 전문가 시스템)

: "if"와 "else"로 하드 코딩된 명령을 사용하는 시스템

=> 많은 상황에 대한 규칙들을 모두 만들어 낼 수 없다

 

- 학습을 통해 기계가 스스로 규칙을 만들어낸다

- 데이터를 이용하여 특성과 패턴을 학습하고, 그 결과를 바탕으로 미지의 데이터에 대한 미래결과(값, 분포)를 예측하는 것

의료 인공지능 분야 사례

영상 의료/병리 데이터의 분석 및 판독(Deep Learning)
- 영상의학과 전문의

 

실습  - ex01

비만도 데이터를 이용해 학습


KNN 알고리즘
- 유유상종 : 같은 무리끼리 서로 내왕하며 사귐

 

# 데이터 불러오기
# 1. 판다스 importS
# 2. csv파일 로딩
# 3. 위쪽 5개 살펴보기
import pandas as pd
bmi_data = pd.read_csv('./data/bmi_lbs.csv')
bmi_data.head()

# 비만도 컬럼의 종류를 확인해보자.
=> .value_counts( )
=> .unique( )
bmi_data['Label'].value_counts( )
bmi_data['Label'].unique( )

# 몸무게를 파운드 -> kg단위로 변경
bmi_data['Weight(kg)'] = bmi_data['Weight(lbs)']*0.453592
bmi_data.head()

# 기술통계 확인
=> .describe( )

bmi_data.describe()


# 문제와 답을 분리

X = bmi_data[["Height","Weight(kg)"]]
y = bmi_data['Label']

X.shape, y.shape
#((500, 2), (500,))


데이터 학습시키기

bmi_model.fit(X,y)
# => KNeighborsClassifier()


3. 모델 예측
# 샘플데이터 추출

X_sample = bmi_data.iloc[[10,76,111,342,485],[2,4]]
X_sample
y_sample = bmi_data.iloc[[10,76,111,342,485],0]

pre = bmi_model.predict(X_sample)
pre
# => array(['Normal', 'Obesity', 'Extreme Obesity', 'Obesity', 'Obesity'],
#      dtype=object)


4. 정확도
# 모델평가 함수 활용하기

# 모델평가 함수 활용하기
from sklearn.metrics import accuracy_score #정확도(전체중에서 정확히 맞춘 비율)

score = accuracy_score(y_sample,pre) # 실제 정답, 모델의 예측값
score
# => 1.0


# 문제점

  • 500명의 비만도 데이터를 학습하고 그중에서 5명을 추출해서 평가를 진행하는 방법은 옳지않다.
  • 이미 모델이 500명에대해서 학습했기때문에 상대적으로 추출한 5명을 잘 맞출 확률이 높다.
  • 그래서 머신러닝에서는 훈련용데이터와 평가용데이터를 사전에 구분해서 활용한다.
  • 일반적으로 비율은 7:3으로 활용한다.
#훈련용,평가용 데이터 분리
from sklearn.model_selection import train_test_split 

#train_test_split() -> 랜덤 샘플링
#test_size => 0.75, 0.25가 기본값!
#random_state => 같은 난수가 생성되도록 지정
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3,random_state=219)
X_train.head( )
X_train.shape, y_train.shape
# => ((350, 2), (350,))

X_test.shape, y_test.shape
# => ((150, 2), (150,))

 

# 모델정의 > 모델학습 > 모델예측 > 모델평가
bmi_model2 = KNeighborsClassifier()
bmi_model2.fit(X_train,y_train)
pre2 = bmi_model2.predict(X_test)
score2 = accuracy_score(y_test,pre2)
score2
# => 0.9066666666666666

 

# 모델활용
bmi_model2.predict([[170,60],[179,60]])
# => /usr/local/lib/python3.7/dist-packages/sklearn/base.py:451: UserWarning: X does not have valid feature names, but KNeighborsClassifier was fitted with feature names
#     "X does not have valid feature names, but"
#      array(['Normal', 'Weak'], dtype=object)

 

파일마다 구글 드라이브 마운트하기

 

# 현재 작업 경로
!pwd

# 현재 폴더 내부 상황
!ls

# 작업 경로 변경하기
%cd ~~~

안드로이드

숙제 문제 풀이

# 이전, 다음 버튼을 누르면 사진이 변경되어 보이도록

코드

더보기
package com.example.ex0407;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity4 extends AppCompatActivity{

    ImageView img;
    Button btnPre,btnNext;
    int cnt = 0;
    //이미지 배열 생성
    int[] imgArr = {R.drawable.dog1,R.drawable.dog2,R.drawable.dog3};
    int idx;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);

        img = findViewById(R.id.img);
        btnPre = findViewById(R.id.btnPre);
        btnNext = findViewById(R.id.btnNext);

        btnNext.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                if(idx == imgArr.length-1){
                    idx = 0;
                }else{
                    idx += 1;
                }
                img.setImageResource(imgArr[idx]);
            }
        }); //end btnNext

        btnPre.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                if(idx == 0){
                    idx = imgArr.length-1;
                }else{
                    idx -= 1;
                }
                img.setImageResource(imgArr[idx]);
            }
        });
    }//end onCreate

//    @Override
//    public void onClick(View view) {
//        int getId = view.getId();
//
//        if(getId == R.id.btnNext){
//            cnt++;
//            if(cnt > 2){
//                cnt = 0;
//            }
//            img.setImageResource(imgArr[cnt]);
//        }else{
//            cnt--;
//            if(cnt < 0){
//                cnt = 2;
//            }
//            img.setImageResource(imgArr[cnt]);
//        }
//    }
}

#흔들기 버튼을 눌렀을 때 주사위 이미지가 바뀌고 두 주사위가 같은 주사위 눈이면 무승부 알림 창 띄우기!
#더 높은 주사위가 나온 쪽 점수를 증가!

코드
더보기
package com.example.ex0407;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Random;

public class MainActivity5 extends AppCompatActivity {

    TextView tvUser1,tvUser2;
    ImageView imgDice1,imgDice2;
    Button btnShake;
    Random ran;

    //이미지 배열 생성
    int[] imgArr = {R.drawable.dice1,R.drawable.dice2,R.drawable.dice3,
                    R.drawable.dice4,R.drawable.dice5,R.drawable.dice6};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main5);

        tvUser1 = findViewById(R.id.tvUser1);
        tvUser2 = findViewById(R.id.tvUser2);
        imgDice1 = findViewById(R.id.imgDice1);
        imgDice2 = findViewById(R.id.imgDice2);
        btnShake = findViewById(R.id.btnShake);

        ran = new Random();

        btnShake.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {

                //1. 랜덤수를 2개 생성(범위:0~5)
                //2. 랜덤수를 인덱스로 활용하여 imgArr에 접근
                //3. 접근한 이미지값을 imgDice1, imgDice2에 적용
                int idx1 = ran.nextInt(6);
                int idx2 = ran.nextInt(6);

                //이미지 변경
                imgDice1.setImageResource(imgArr[idx1]);
                imgDice2.setImageResource(imgArr[idx2]);

                //4. 2개의 TextView의 내용을 변수에 저장
                //5. 연산이 가능하도록 정수로 변환
                //6. 두 주사위눈을 비교하여 큰 쪽에 + 1 되도록 구현
                int user1 = Integer.parseInt(tvUser1.getText().toString());
                int user2 = Integer.parseInt(tvUser2.getText().toString());

                if(idx1 == idx2){
                    Toast.makeText(MainActivity5.this,
                                    "무승부!",
                                    Toast.LENGTH_SHORT).show();
                }else if(idx1 > idx2){
                    user1 += 1;
                    tvUser1.setText(String.valueOf(user1));
                }else{
                    user2 += 1;
                    tvUser2.setText(String.valueOf(user2));
                }
            }
        });//end setOnClickListener

    }
}

 

Layout 이란

: 화면 안에 넣은 뷰의 크기와 위치를 지정하는 공간

Layout 종류

기본 레이아웃

 

Linear Layout 실습



LinearLayout(vertical) 생성


Layout(vertical) 설정
=> 위쪽, 왼쪽에 영역 지정 / layout_width, lay_height 설정


button Layout 속성 지정



LinearLayout(horizontal) 생성

Layout(vertical) 설정
=> 위쪽, 왼쪽에 영역 지정 / layout_width, lay_height 설정
button Layout 속성 지정
=> layout_weight 가중치(비율)

버튼 클릭 후 margin 검색해서 변경할 margin값과 단위 입력!

Linear Layout 실습


xml 파일만 생성


colors.xml 설정

 

728x90
Comments