머신러닝 3일차

ParkJinYoung·2022년 10월 20일
#함수 정의하기
def bmi(label,color):
    d = data.loc[label]
    plt.scatter(d['Height'],d['Weight'],c = color, label = label)
    
data.index.unique()
#함수 호출하기
bmi('Extreme Obesity','red')
bmi('Obesity','blue')
bmi('Overweight','green')
bmi('Normal','yellow')
bmi('Weak','purple')
bmi('Extremely Weak','orange')

plt.legend()
plt.show()
# 탐색적 데이터 분석을 하면서 데이터 전처리에 대해 생각가능
#현재는 큰 이상치가 아니기 때문에 그냥 진행
#만약 정확도가 낮다면

모델링
-문제와 답으로 데이터 분리

# 특정키와 특정 몸무게 값이 있으면 => X(문제 데이터)
# 그 특정 데이터에 맞는 정답값 => y(답 데이터)
# 데이터 셋팅
X=data[['Height','Weight']]
y=data.index
#데이터의 크기 확인
print('문제데이터', X.shape)
print('정답데이터', y.shape)

#상위 5개 행만 출력
#display(X.head(n=3)) 위에서 3개만 출력
display(X.head())

#전체 데이터를 학습용 데이터와 테스트용 데이터로 분리하기
#훈련용 데이터 70% 테스트용 데이터 30% 분리

#훈련용 데이터 =350개
X_train=X[:350]
y_train=y[:350]

#테스트용 데이터 =150개
X_test=X[350:]
y_test=y[350:]

print(X_train.shape) #훈련용 문제데이터
print(y_train.shape) #훈련용 정답데이터
print(X_test.shape) #테스트용 문제데이터
print(y_test.shape) #테스트용 정답데이터

#모델 객체 생성
#가장 가까운 이웃 몇명 만 본다
knn = kn(n_neighbors=5)

#모델학습
knn.fit(X_train,y_train)

#모델예측 => predict(테스트용 문제)
pre = knn.predict(X_test)

#모델평가 => accuracy_score(예측한데이터,실제답)
acs(pre,y_test)*100
print(f"{acs(pre,y_test)*100:.2f}%")
#정확도 출력

#또다른 모델 평가방법 = 모델.score(테스트용 문제, 테스트용 답)
knn.score(X_test,y_test)*100

iris 붓꽃데이터

목표
knn : 유유상종에 맞는 붓꽃판별
knn 모델을 사용하여 이웃의 숫자를 조정해 최적의 모델을 만들어보자
붓꽃데이터 : 꽃잎의 넓이, 길이 / 받침의 넓이, 길이 4가지 특성으로 모델 생성
3개의 클래스(정답 데이터)를 가진다

#도구 불러오기
import matplotlib.pyplot as plt
import pandas as pd

# iris 데이터 불러오기
from sklearn.datasets import load_iris #붓꽃데이터

#모델불러오기
from sklearn.neighbors import KNeighborsClassifier as kn

#정확도 측정해주는 도구
from sklearn.metrics import accuracy_score as acs

#iris데이터 확인하기
iris_data = load_iris()

#bunch(묶음, 다발) => 딕셔너리처럼 생긴 머신러닝에서 쓰이는 개념

# data안에있는 값에서 세로값으로 볼 수 있는 것이 특성값이다.
# target = label (여기서는 0,1,2 라고 출력)
# 순서대로 나열 되어있음

#DESCR : 데이터의 정보를 알려주는 칸

# 데이터의 키값들만 확인하기
iris_data.keys()

# 특성(문제 데이터) 확인
iris_data['data']
iris_data['data'][:5]

# 특성 4개의 이름 확인 - feature_names
iris_data['feature_names']
# ['sepal length (cm)', 꽃받침의 길이
#  'sepal width (cm)', 꽃받침의 너비
#  'petal length (cm)', 꽃잎의 길이
#  'petal width (cm)'] 꽃잎의 너비

# Label(정답 데이터) 확인 - target 안에 존재
iris_data['target']
# 3가지 품종이 있다 (0,1,2) 이름은 target_names에 있음

# Label실제 데이터 이름 (품종) 확인 - target_names
iris_data['target_names']
#'setosa' = 0, 'versicolor' = 1, 'virginica' = 2

# 데이터 설명 확인하기
print(iris_data['DESCR'])

# 행개수 : 150개 (각 클래스 50개 행 3클래스) - Instances
# 특성의 개수 : 4개이다 - Attribute

# 데이터 설명 확인하기
print(iris_data['DESCR'])

# 행개수 : 150개 (각 클래스 50개 행 3클래스) - Instances
# 특성의 개수 : 4개이다 - Attribute
# 데이터 설명 확인하기
print(iris_data['DESCR'])

# 행개수 : 150개 (각 클래스 50개 행 3클래스) - Instances
# 특성의 개수 : 4개이다 - Attribute

데이터 셋 구성하기
문제데이터 DataFrame 으로 변경
문제(X)와 답(y)으로 분리
훈련 (X_train,y_train) / 테스트 (X_test,y_test) 분리

iris_df = pd.DataFrame(iris_data['data'],columns=iris_data['feature_names'])
iris_df

#문제데이터 X, 답데이터y로 분리
X=iris_df
y=iris_data['target']

#train, test 분리 해주는 도구 train_test_split
#사이킷 런에서 제공
from sklearn.model_selection import train_test_split

#(문제,답,test_size=0.3(test 30%)) => 랜덤 샘플링도 해줌
X_train,y_train,X_test,y_test=train_test_split(X,y, test_size=0.3)

#출력해보면 랜덤으로 나온다
#기능안에 랜덤 샘플링 기능 포함

#train_test_split 기능 => train / test 분리 , 랜덤샘플링

#실행 할때마다 랜덤샘플링된다.
#고정해주려면 => random_state=0
#학습 데이터가 계속 변경되면
#하이퍼 파라미터를 변경해서 반복 수행하는것이 의미가 없어지기때문이다.
X_train,y_train,X_test,y_test=train_test_split(X,y, test_size=0.3,random_state=0)

#데이터 크기 확인
print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)


profile
꾸준히

0개의 댓글