머신러닝(1)
머신러닝 개요
머신러닝의 종류는 크게 3가지로 구분이 된다.
- 지도학습
- 비지도학습
- 강화학습
판다스를 이용하여 머신러닝 할 데이터를 불러오기
from sklearn.datasets import load_breast_cancer
를 해주고 데이터 셋을 불러온다.
xdf_cancer = load_breast_cancer()
df_canter = pd.DataFrame(data = df_cancer.data, columns = df_cancer.feature_names)
from sklearn.neighbors import KNeighborsClassifier
를 하여 알고리즘 하나를 불러온다.
xxxxxxxxxx
knn = KNeighborsClassifier() #모델생성
knn.fit(data_iris.data, data_iris.target) #학습
knn.predict([[3,3,3,1]]) #결과 예측
모델을 생성하고 -> train 데이터를 통해서 모델에 학습시키고 -> 학습된 모델에 결과값을 예측할 데이터를 넣어서 결과값을 반환한다.
사이킷런 데이터셋을 조작하고 확인하는 방법
xxxxxxxxxx
data_iris = load_iris()
dir(data_iris)
print(data_iris.DESCR)
data_iris.target_names
data_iris.data
data_iris.feature_names
.DESCR
을 하면 사이킷런 데이터셋에 대한 정보를 깔끔하게 확인 가능하다.
feature_names
같은 경우에는 칼럼명을 의미한다.
target_names
같은 경우에는 타겟 데이터의 레이블명을 의미한다.
data
같은 경우에는 train 에 사용될 데이터를 의미한다.
xxxxxxxxxx
#관례적으로 학습에 사용되는 데이터는 대문자로 사용하고
#결과 데이터는 소문자로 사용한다.
X = data_iris.data
y = data_iris.target
관례적으로 학습에 사용되는 데이터는 대문자로 사용하고 결과 데이터는 소문자로 사용한다.
왜냐하면 훈련으로 사용되는 데이터는 행렬로 되어 있고 타겟은 벡터 데이터로 되어 있는데,
벡터는 소문자로 주로 사용하는 관례 때문에 타겟을 소문자로 사용하는 것.
(벡터 : 소문자)
xxxxxxxxxx
df_iris = pd.DataFrame(data = data_iris.data, columns = data_iris.feature_names)
df_iris['target'] = data_iris.target
df_iris.head()
사이킷런으로 불러온 데이터를 분석할 데이터셋으로 만들때 위와 같은 코드를 사용함.
xxxxxxxxxx
#타겟 데이터와 데이터를 합치는 두 번째 방법
df_iris = pd.DataFrame(data = data_iris.data, columns = data_iris.feature_names)
iris_target_df = pd.DataFrame(data = data_iris.target, columns = ['target'])
df_iris2 = pd.concat([df_iris, iris_target_df], axis = 1)
pd.concat([])
을 통해서 데이터셋의 훈련 데이터와 타겟 데이터를 합치는 두 번째 방법이다.
위쪽의 다른 코드를 보면 concat 을 사용하지 않고 바로 인덱싱 처리로 생성했었다.
xxxxxxxxxx
data_boston_pd = pd.DataFrame(data = data_boston.data, columns = data_boston.feature_names)
data_boston_target = pd.DataFrame(data = data_boston.target, columns = ['target'])
df_boston = pd.concat([data_boston_pd, data_boston_target], axis = 1)
df_boston.head()
사이킷런 아이리스 데이터 말고 다른 데이터를 정제해보겠다.
이때 사용되는 보스턴 주택가격 데이터 같은 경우에는 타겟 데이터의 이름들이 없다.
왜냐하면 타겟 데이터가 범주데이터가 아니라 구간데이터이기 때문이다.
타겟이 구간데이터일 경우 분류를 사용하지 않고 회귀를 사용한다.
모든 회귀는 분류로 환원 가능
타겟이 구간데이터이지만 함수를 사용해서 구간데이터를 범주화 가능
xxxxxxxxxx
#pd.cut -> 일정한 간격으로 자르는 것
#pd.qcut -> 일정한 개수로 자르는 것 (몇 간격이 나올지 모름)
pd.cut(data_boston.target, 10)
#구간 데이터를 총 10개의 구간으로 나누어서 10개의 범주를 만들었다.
df =pd.DataFrame()
df['level'] = pd.cut(data_boston.target, 10)
df['level']
#10개로 나누어진 범주의 데이터의 도수를 확인
df['target'] = data_boston.target
df.groupby('level').count()
타겟이 구간데이터인 경우, 구간 데이터를 일정한 간격으로 나누어서 이를 범주화할 수 있다.
pd.cut()
같은 경우에는 구간의 개수를 지정한다.
pd.qcut()
같은 경우에는 한 구간의 개수를 지정한다. 따라서 구간의 개수는 계산을 해야 도출이 된다.
xxxxxxxxxx
#qcut 으로 target 을 나누었을 대의 target 개수
#10개로 나누었음
pd.qcut(data_boston.target, 10)
df = pd.DataFrame()
df['level'] = pd.qcut(data_boston.target, 10)
df['level']
df['target'] = data_boston.target
df.groupby(by = 'level').count()
pd.qcut()
을 사용해서 구간데이터를 범주화 해봄.
이때 구간 안에 들어갈 데이터 개수를 10개로 지정.
그룹바이로 확인해보니 개수가 같은 것도 있고 다르게도 나오지만, 거의 차이가 없다.
알고리즘의 정의와 구성요소들
xxxxxxxxxx
# 1. 하이퍼 파라미터 (hyperparameter) : 학습을 통해서 얻을 수 없어서 직접 지정해야 하는 변수
# ㄴ> 하이퍼 파라미터 값으로 성능 개선.
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
vars(knn) # 알고리즘에서 사용할 수 있는 하이퍼 파라미터값을 확인하기
분류와 회귀 구분
=> classifier 는 분류
=> Regression 은 회귀
- 하이퍼 파라미터값
vars()
안의 매개변수 값에 알고리즘 변수를 적어주면, 그 알고리즘에서 사용하는 하이퍼 파라미터 값의 목록을 확인할 수 있다.
하이퍼 파라미터 => 사용자가 직접 지정해줘야 하는 값, 인공지능으로 자동 x
학습 메서드
xxxxxxxxxx
knn.fit(data_iris.data, data_iris.target)
통계에서는 학습을 적합(fit) 이라고 부른다.
컴퓨터 과학에서는 훈련(train) 이라고 부른다.
학습데이터와 타겟 데이터를 분리해서 가져오는 방법
xxxxxxxxxx
#타겟 제외 데이터만 가져오는 방법
X = df_iris2.iloc[:,:-1] #iloc 사용법
X = df_iris2[df_iris2.columns[:-1]] #columns 함수 사용법
데이터만 가져오는 경우
iloc
인덱싱을 사용하여 가져오는 방법과columns[]
함수를 사용하여 인덱싱한 후 가져오는 방법xxxxxxxxxx
#타겟 데이터만 가져오기
y = y.target
y
타겟값만 가져오는 경우
target 칼럼만 인덱스로 지정하여 변수에 담기
예측 메서드
xxxxxxxxxx
# Expected 2D array, got 1D array instead 오류가 발생한다.
#1차원인데, 2차원을 기대한다고 하니, 차원을 2차원으로 맞춰줘야 한다.
knn.predict([3,4,4,2])
predict()
함수를 이용해서 새로운 데이터가 들어오면 알맞은 값으로 결과값을 반환한다.하지만 안에 매개변수를 일차원으로 넣어주면 에러가 생긴다.
2D array 를 기대한다는 오류가 뜨기 때문에 2차원으로 매개변수 값을 맞춰준다.
xxxxxxxxxx
#예측결과값이 나왔을 때 label 확인하는 방법
knn.predict([[3,4,4,2]])
data_iris.target_names[1]
predict()
로 결과 값이 나오면 그 결과값이 어떤 label 인지 확인하기 위해서 위와 같이 인덱스 값을 집어 넣는다.xxxxxxxxxx
#예측해야될 데이터가 여러 개일 때 데이터를 여러개 집어넣을 수 있다.
knn.predict([[3,4,4,2],[1,3,1,3]])
예측해야될 데이터가 여러 개일때 여러개를 집어넣을 수 있다.