머신러닝
강사: 이주화님
1. 머신러닝
1.1. 데이터 수집
: 머신 러닝에 활용할 학습 데이터 수집
- 자체 데이터 수집
- 데이터 제공 사이트 활용
- Google: https://toolbox.google.com/datasets
- Kaggle: https://www.kaggle.com/datasets
- 공공 데이터 포털: https://www.data.go.kr/
- AI 허브: https://aihub.or.kr/
- 웹 크롤링
- 웹 사이트 내 데이터 수집
1.2. 데이터 전처리
: 데이터 형식 변형 및 비어 있는 값 채우기, 연관 데이터 추가, 삭제
2. 머신러닝 성능 평가
2.1. Confusion Matrix(혼동 행렬)
- 모델의 성능을 평가할 때 사용되는 지표
- 예측 값이 실제 관측값을 얼마나 정확히 예측했는지 보여 주는 행렬
- TN(True Negative) : 실제 답이 음성인데 음성으로 예측했다는 뜻, 진단과 실제가 일치했고 음성이라고 진단해서 맞혔으므로 True(예측 성공) Negative(진단 음성)이라고 표현
- FP(False Positive) : 실제 답은 음성인데 양성으로 잘못 진단한 경우. 양성라고 진단했는데 틀렸으므로 이런 경우는 False(예측 실패) Positive(진단 양성)이라고 표현
- FN(False Negative) : 실제 답은 양성인데 음성으로 잘못 진단한 경우. 음성이라고 진단했는데 틀렸으므로, 이런 경우는 False(예측 실패) Negative(진단 음성)이라고 표현
- TP(True Positive) : 실제 답이 양성인데 양성으로 바르게 진단한 경우. 이런 경우는 True(예측 성공) Positive(진단 양성)이라고 표현
2.2. Accuaracy(정확도)
: 모델이 입력된 데이터에 대해 얼마나 정확하게 예측하는 지를 알려준다.
정확도 = 예측 값 결과와 실제 값이 동일한 건수 / 전체 데이터 수 = (TP+TN) / (TP+TN+FN+FP) |
2.3. Precision(정밀도)
정밀도 = TP / (TP+FP) |
이 다음부터는 어렵네요. 천천히 정리해야 할 것 같습니다.
3. 실습
3.1. k-NN (k-Nearest Neighbors) 알고리즘(지도학습)
: k-NN 알고리즘은 새로운 데이터로부터 거리가 가까운 k개의 다른 데이터의 속성을 참고하여 k개의 데이터 중 가장 빈도 수가 높게 나온 데이터의 레이블로 분류하는 알고리즘이다.
- Scatter 그리기
# 닥스훈트의 길이와 높이 데이터
dach_length = [75, 77, 83, 81, 73, 99, 72, 83]
dach_height = [24, 29, 19, 32, 21, 22, 19, 34]
# 사모예드의 길이와 높이 데이터
samo_length = [76, 78, 82, 88, 76, 83, 81, 89]
samo_height = [55, 58, 53, 54, 61, 52, 57, 64]
# 말티즈의 길이와 높이 데이터
malti_length = [35, 39, 38, 41, 30, 57, 41, 35]
malti_height = [23, 26, 19, 30, 21, 24, 28, 20]
plt.scatter(dach_length, dach_height,c='red', label='닥스훈트') # 색상을 레드로
plt.scatter(samo_length, samo_height, marker='^', label='사모예드') # 마커를 세모로
plt.scatter(malti_length, malti_height, label='말티즈')
plt.xlabel('Length (cm)')
plt.ylabel('Height (cm)')
plt.title('Dog Breeds')
plt.legend()
plt.show()
# 결과
※ Matplotlib 마커 지정하기
- New data 추가하기
newdata_length=[79]
newdata_height=[35]
plt.scatter(dach_length, dach_height,c='red', label='Dachshund') # 색상을 레드로
plt.scatter(samo_length, samo_height, marker='^', label='Samoyed') # 마커를 세모로
plt.scatter(malti_length, malti_height, label='maltese')
plt.scatter(newdata_length, newdata_height, c='black', marker='D', label='New data')
plt.xlabel('Length (cm)')
plt.ylabel('Height (cm)')
plt.title('Dog Breeds')
plt.legend()
plt.show()
# 결과
- csv 파일 가져오기
import pandas as pd
dog = pd.read_csv('/content/dog.csv')
dog
# 학습 데이터(dog.csv)
...
- 사이킷런(sklearn-run) 라이브러리에서 K-NN 알고리즘 사용
from sklearn.neighbors import KNeighborsClassifier
k = 5
knn = KNeighborsClassifier(n_neighbors=k) # 모델 만들기
knn.fit(x, y) # x, y 값 학습시키기
- 예측 결과 확인
y_pred = knn.predict(x)
y_pred
# 결과
- new data로 결과 확인
y_pred_new = knn.predict([[59, 35]])
y_pred_new
# 결과
- accuracy(정확도) 확인
from sklearn import metrics
metrics.accuracy_score(y, y_pred)
# 결과
1.0
-> 결론: 기존의 데이터 그룹 중에서 새로운 데이터가 입력이 되면, k 값에 따라 입력된 데이터에서 k 개수만큼 거리가 가까운 값을 가져와서 새로운 데이터가 어디에 속하는 지 알 수 있게 된다.
3.2. k-means 알고리즘(비지도 학습_클러스터링)
: 데이터들을 K 개의 그룹으로 나뉘어서 학습된 데이터로 예측하는 알고리즘이다.
- 군집화(Clustring)란 소속 집단의 정보가 없고 모르는 상태에서 비슷한 집단으로 묶는 비지도 학습의 하나이다.
- k-means 알고리즘은 원리가 단순하고 직관적이며 성능이 좋은 군집화 알고리즘이다.
- 사전에 군집의 개수 k 값을 지정해야 하는 단점이 있음.
from sklearn.cluster import KMeans
model = KMeans(n_clusters=2) # 모델 선택
model.fit(x) # x만 학습
pred = model.predict(x)
pred
# 결과
참고로, 3개의 그룹으로 설정하면,
- 색상 넣어서 확인해보자.
colors = np.array(['b', 'r', 'g'])
plt.scatter(x['length'], x['height'], c=colors[pred])
plt.xlabel('Length (cm)')
plt.ylabel('Height (cm)')
plt.title('Dog Breeds')
plt.show()
# 결과
4. Linear regression using car data
4.1. 머신러닝 유형
: 학습 데이터에 부합하는 출력 값을 찾아주는 함수를 찾아내는 방법
- car 데이터 불러오기
import pandas as pd
car = pd.read_csv('/content/car.csv')
car
# 데이터 확인
...
- LinearRegression 학습
from sklearn.linear_model import LinearRegression
x = car[['horce power']]
y = car['efficiency']
model = LinearRegression()
model.fit(x, y)
- 기울기, 절편, 점수 구하기
print('기울기 :', model.coef_ )
print('절편 :', model.intercept_)
print('점수 :', model.score(x, y))
# 결과
기울기 : [-0.04983516]
절편 : 22.465384615384618
점수 : 0.8692402789518174
- 예측하기
pred = model.predict([[270]])
pred
# 결과
array([9.00989011])
- 270마력 연비 구하기
y = -0.04983516 * 270 + 22.465384615384618
y
# 결과
9.009891415384617(9.01km/l)
- 중량 추가
x = car[['horce power, weight']]
y = car['efficiency']
model = LinearRegression()
model.fit(x, y)
print('기울기 :', model.coef_ )
print('절편 :', model.intercept_)
print('점수 :', model.score(x, y))
# 결과
기울기 : [-0.00685328 -0.00724324]
절편 : 30.409073359073354
점수 : 0.8856493168993169
- 270마력, 2500kg로 예측하기
pred = model.predict([[270, 2500]])
pred
# 결과
array([10.45057915])
- 연비 구하기
y = (-0.00685328 * 270) + (-0.00724324 * 2500) + 30.409073359073354
y
# 결과
10.450587759073354(10.45km/l)
다음 데이터는 seaborn에서 제공하는 flights 데이터 셋을 읽어서 데이터 셋의 shape을 출력한 후, head() 메소드로 데이터를 살펴보자.
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
car = pd.read_csv('/content/car.csv')
from sklearn import linear_model # scikit-learn 모듈을 가져온다
# seaborn에서 제공하는 car 데이터 셋을 로딩함
print('car 데이터의 shape :', car.shape) # 데이터의 형상을 살펴보자
print()
print(car.head())
# 결과
car 데이터의 shape : (7, 4)
name horce power weight efficiency
0 A 130 1900 16.3
1 B 250 2600 10.2
2 C 190 2200 11.1
3 D 300 2900 7.1
4 E 210 2400 12.1
- seaborn의 heatmap 그려보자.
import seaborn as sns
import matplotlib.pyplot as plt
# Set figure size
sns.set(rc={'figure.figsize': (10, 10)})
# 데이터프레임에서 선택한 열의 상관관계 행렬을 계산
correlation_matrix = car[['horce power', 'weight', 'efficiency']].corr()
# 상관관계 행렬을 시각화
sns.heatmap(data=correlation_matrix, annot=True, fmt=".2f", cmap="coolwarm")
plt.show()
※ 참고로, 불러온 데이터의 horce power 오타가 있음. 코드에서 해당 오타에 맞게 설정해야 표시됨.
5. 타이타닉 분류
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
data = pd.read_csv('train.csv')
data.head()
# 데이터 정보 확인
data.info()
data.describe()
# 데이터 전처리
#결측치 처리
data.isna().sum()
5.1. 데이터 전처리
# 결측치 채우기
data['Age'].fillna(data['Age'].median(), inplace=True)
data.isna().sum()
data['Embarked'].value_counts()
data['Embarked'].fillna('S', inplace=True)
data.isna().sum()
# cabin 삭제
data.drop(['Cabin'], axis=1, inplace=True)
- 데이터 확인
data.info()
- 생존자 분석
sns.countplot(data=data, x='Pclass', hue='Survived')
sns.countplot(data=data, x='Sex', hue='Survived')
age = pd.cut(data.Age, [0, 9, 19, 29, 39, 49, 59, 69, 79, 100], labels=[0, 10, 20, 30, 40, 50, 60, 70, 80])
data.Age = age
data.info()
- 학습에 불필요한 컬럼들은 삭제함.
#'PassengerId', 'Name', 'Ticket’ 삭제
data.drop(['PassengerId', 'Name', 'Ticket'], axis=1, inplace=True)
data.info()
- Object는 문자로 학습이 되지 않고 오류가 발생됨.(데이터 전처리)
# objdect를 숫자로 변환 : sex, embarked
num_data = data.copy()
num_data['Sex']= data['Sex'].map({'male':0, 'female':1})
num_data['Embarked']= data['Embarked'].map({'C':0, 'Q':1, 'S':2})
num_data.head()
- 데이터 확인
num_data.info()
5.2. k_NN 알고리즘을 사용해서 분류를 해보자.(지도학습)
- 독립변수와 종속 변수 지정
X = num_data[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']]
y = num_data['Survived']
- train과 test 분리
trainX, testX, trainY, testY = train_test_split(X, y, test_size=0.2, random_state=25)
- k-NN 알고리즘 가져오기
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors = 3)
knnModel = classifier.fit(trainX, trainY)
knnPred = knnModel.predict(testX)
knnModel.score(testX, testY)
# 결과
0.7374301675977654
X = num_data[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']]
y = num_data['Survived']
trainX, testX, trainY, testY = train_test_split(X, y, test_size=0.2, random_state=25)
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler() # minmax scaler, 모든 값을 0과 1 사이의 값으로 정규화
trainX = scaler.fit_transform(trainX)
testX = scaler.fit_transform(testX)
classifier = KNeighborsClassifier(n_neighbors = 3)
knnModel = classifier.fit(trainX, trainY)
knnPred = knnModel.predict(testX)
knnModel.score(testX, testY)
# 결과
0.7821229050279329
from sklearn.metrics import classification_report
print(classification_report(testY, knnPred))
- scikit-Learn 라이브러리에서 제공하는 결정 트리 기반 분류 알고리즘 사용하기
: 데이터를 트리 구조로 분할하여 분류 문제를 해결하는 방법
from sklearn.tree import DecisionTreeClassifier
dec_tree = DecisionTreeClassifier(max_depth=5)
dec_tree.fit(trainX, trainY)
train_pred = dec_tree.predict(trainX)
print(classification_report(trainY, train_pred))
-> 결정 트리 기반 분류 알고리즘이 성능이 더 좋은 것을 확인할 수 있음.
출처: AI Hub 교육과정 - WEB+AI (위 내용이 문제가 된다면 댓글에 남겨주세요. 바로 삭제조치하도록 하겠습니다.)
'Programming 개발은 구글로 > 기타 정보' 카테고리의 다른 글
[WEB+AI] 23일차 오렌지 3 통계 2/3 (1) | 2024.11.15 |
---|---|
[WEB+AI] 22일차 오렌지 3 통계 1/3 (1) | 2024.11.12 |
[WEB+AI] 20일차 Orange 3를 이용한 데이터 사이언스 입문 (7) | 2024.11.08 |
[WEB+AI] 19일차 사생대회 + 파이썬 (2) | 2024.11.07 |
[WEB+AI] 18일차 Web+AI 사생대회 (6) | 2024.11.06 |
댓글