파이썬 머신러닝 라이브러리
머신러닝 기술을 활용하는 데 필요한 다양한 기능을 제공하며, 머신러닝 모델을 만들 수 있는 최적의 라이브러리다.
딥러닝 모델을 Tensor flow, Keras, Pytorch 등을 이용해 생성할 수 있는 것처럼 머신러닝 모델은 주로 Scikit-learn 라이브러리를 통해 만들어 낼 수 있다.
사이킷런 라이브러리는 다음과 같은 모듈로 사용할 수 있다.
학습을 위한 다양한 feature와 label데이터로 모델을 학습한 뒤, 별도의 테스트 데이터셋에서 미지의 label을 예측한다. 다시 말해 답이 주어진 데이터 셋을 학습 시켜놓고 미지의 정답을 예측하는 방식이다.
from sklearn.model_selection import train_test_split
train_input, test_input, train_label, test_label = train_test_split(iris_dataset['data'], iris_dataset['target'], test_size=0.25, random_state=42)
K=1이면 예측하고자 하는 데이터에서 가장 가까운 데이터 하나만 참고해서 그 데이터와 같은 라벨이라고 예측하고, K=3이면 가장 가까운 데이터 3개를 참고하게 된다.
데이터의 대한 가정이 없어 심플
다목적 분류와 회귀에 좋다
높은 메모리 사용
K값이 증가하면 계산이 오래 걸림
관련 없는 기능의 데이터의 규모에 민감
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors = 1)
knn.fit(train_input, train_label)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=1, p=2,
weights='uniform')
#새로운 4개의 피쳐값으로 넘파이 배열을 만들어 모델에 적용하여 라벨을 예측해보기
newInput = np.array([[6.1, 2.8, 4.7, 1.2]])
knn.predict(new_input)
array([1])
#하지만 이것은 임의로 만든 것이라 이 결과가 제대로 예측된 한 것인지 알 수 없다. 그래서 따로 분리 해둔 평가 데이터를 사용해 모델의 성능을 측정해보자.
predictLabel = knn.predict(test_input)
// 이렇게 하면 정확도가 1이 나온다.
데이터 안에서 대표하는 군집의 중심을 찾는 알고리즘이다.
from sklearn.cluster import KMeans
kMeans = KMeans(n_clusters=3)
kMeans.fit(train_input)
KMeans(algorithm='auto', copy_x =True, init='k-means++', max_iter=300,
n_clusters=3, n_init=10, n_jbos=1, precompute_distances='auto',
random_state=None, tol=0.0001, verbose=0)
#fit 함수를 사용해 data와 label을 입력하면 자동으로 데이터를 군집화한다.
앞선 지도학습 모델과 다른 점은 fit에 데이터의 라벨값을 넣지않았다. 그 이유는 K-means clustering에서는 라벨이 필요하지 않기때문이다.
predict_cluster = kMeans.predict(test_input)
#결과는 정확도 0.95가 나와 지도학습 모델보다 조금 적게 나오지만, 라벨을 주지않고도 이런 결과는 높다.
자연어 처리에서 특징 추출이란 텍스트 데이터에서 단어나 문장들을 어떤 특징 값으로 바꿔주는 것을 의미한다.
텍스트 데이터를 수치화 하는 방법 3가지
CountVectorizer
각 텍스트에서 횟수를 기준으로 특징 추출
data = ['나는 배가 부르다', '오늘 저녁 뭐먹지', '오늘 운동 해야겠다.', '아침 먹고 운동 해야지']
cv = CountVectorizer()
cv.fit(data)
print(cv.vocabulary_)
* 결과: {'나는': 2, '배가': 6, '부르다':0, '오늘':3, '저녁':7, '뭐먹지': 5, '운동':1, '해야겠다':8, '먹고':4, '해야지':9}
//데이터를 벡터로 만들기
sentence = [data[0]] # ['나는 배가 부르다.']
print(cv.transform(sentence).toarray())
* 결과: [[1 0 1 0 0 0 1 0 0 0]]
TfidVectorizer
TF-IDF 사용
TF와 IDF 값을 서로 곱해서 사용한다.
어떤 단어가 해당 문서에는 자주 등장하지만 다른 문서에는 많이 없으면 높은 값을 가진다.
tfv = TfidVectorizer()
tfv.fie(data)
print(tfv.vocabulary_)
* 결과: {'나는': 2, '배가': 6, '부르다':0, '오늘':3, '저녁':7, '뭐먹지': 5, '운동':1, '해야겠다':8, '먹고':4, '해야지':9}
sentence = [data[3]] # 아침먹고 운동해야지
print(tfv_vectorizer.transform(data).toarray()
* 결과: [[0. 0.43779123 0. 0. 0.55528266 0.
0. 0.43779123 0. 0.55528266 ]]
1, 4, 7, 9 번째 단어를 제외한 단어들은 사용되지 않아서 모두 0값이 나왔다.
그리고 1, 7번 단어는 0.4 정도의 값과 4, 9번 단어는 0.5 정도의 값을 가져 중요도를 나타낸다.
이러한 방식은 단순 횟수 보다 단어의 특성을 잘 반영할 수 있다.
HashingVectorizer
CountVectorizer와 동일하지만 텍스트를 처리할 때 해시 함수를 사용하여 실행 시간을 단축함.
사이킷런은 ML모델 학습을 위해 fit(), 학습된 모델의 예측을 위해 predict()를 제공한다. 지도학습의 주요 두 축인 분류와 회귀의 다양한 알고리즘을 fit()과 predict()로 간단히 구현한다. 사이킷런은 많은 종류의 classifier와 Regressor를 제공하는데 이를 통칭해 Estimator라 부른다.
X_train - 학습용 피처 데이터 세트
X_test - 테스트용 피처 데이터 세트
y_train - 학습용 레이블 데이터 세트
y_test - 테스트용 레이블 데이터 세트
알고리즘을 학습시키는 학습 데이터와 이에 대한 예측 성능을 평가하기 위한 별도의 테스트용 데이터가 필요하다. 하지만 이 방법 역시 오버피팅에 취약한 약점을 가질 수 있다. 학습한 데이터만 편향적으로 표현될 수 있다.
가장 보편적으로 사용되는 교차 검증 기법으로, 먼저 K개의 데이터 폴드 세트를 만들어서 K번만큼 각 폴드 세트에 학습과 검증 평가를 반복적으로 수행하는 방법이다.
사이킷런의 ML알고리즘을 적용하기 전에 데이터에 대해 미리 처리해야 할 기본 사항
Label encoding
One Hot encoding