• 데이터는 다양한 형태를 가질 것이며 최선의 직선을 긋기가 쉽지 않음
• 과연 위 직선이 가장 최선의 직선일 것인가?
• 함수 𝑦 = 𝑎𝑥 + 𝑏 에서 최선의 기울기 𝑎와 𝑦 절편 𝑏를 결정하는 방법이 필요
• 이것이 선형 회귀이며, 직선을 회귀선이라고 부름
• 회귀 모델에만 사용
독립 변수의 개수로 회귀 분석을 단순회귀
와 다중 회기
로 분류
# 회귀계수 확인
print(model.coef_)
print(model.intercept_)
# 회귀계수 확인
print(list(x_train))
print(model.coef_)
print(model.intercept_)
데이터
# 1단계: 불러오기
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, r2_score
# 2단계: 선언하기
model = LinearRegression()
# 3단계: 학습하기
model.fit(x_train, y_train)
# 4단계: 예측하기
y_pred = model.predict(x_test)
# 5단계: 평가하기
print('MAE:',mean_absolute_error(y_test, y_pred).round(4))
print('R2:',r2_score(y_test, y_pred).round(4))
# 회귀계수 확인
print('* 가중치:', model.coef_)
print('* 편향:', model.intercept_)
# 시각화
plt.plot(y_test.values, label='Actual')
plt.plot(y_pred, label='Predicted')
plt.legend()
plt.ylabel('Dist(ft)')
plt.show()
# dist = a * speed + b
a = model.coef_
b = model.intercept_
speed = np.array([x_train.min(), x_train.max()])
dist = a*speed + b
# 학습 데이터
# speed, dist 관계
plt.scatter(x=x_train['speed'], y=y_train) #학습 데이터
plt.scatter(x=x_test['speed'], y=y_test) #평가 데이터
plt.plot(speed,dist, color='r')
plt.axhline(y_train.mean(), linestyle='--') #학습 데이터 평균 선
plt.xlabel('Speed(mph)')
plt.ylabel('Dist(ft)')
plt.show()
노란색 점이 평가 데이터
데이터
데이터 전처리 x 가변수화
# 1단계: 불러오기
# 2단계: 선언하기
# 3단계: 학습하기
# 4단계: 예측하기
# 5단계: 평가하기
print('MAE:',mean_absolute_error(y_test, y_pred).round(4))
print('R2:',r2_score(y_test, y_pred).round(4))
# 회귀계수 확인
print(list(x_train))
print('* 가중치:', model.coef_.round(2))
print('* 편향:', model.intercept_.round(2))
# 가중치 시각화
tmp = pd.DataFrame()
tmp['feature'] = list(x)
tmp['weight'] = model.coef_
tmp.sort_values(by='weight',ascending=True,inplace=True)
#가로 막대
plt.figure(figsize=(3,5))
plt.barh(tmp['feature'],tmp['weight'])
plt.show()
# 예측값, 실젯값 시각화
plt.figure(figsize=(12,3))
plt.plot(y_test.values, label='Actual', linewidth=0.7, marker='o', markersize=1)
plt.plot(y_pred, label='Predicted' , linewidth=0.7, marker='o', markersize=1)
plt.legend()
plt.ylabel('Sales')
plt.show()
• k-Nearest Neighbor: k 최근접 이웃(가장 가까운 이웃 k개)
• 학습용 데이터에서 k개의 최근접 이웃의 값을 찾아 그 값들로 새로운 값을 예측하는 알고리즘
• 회귀와 분류에 사용되는 매우 간단한 지도학습 알고리즘
• 다른 알고리즘에 비해 이해하기 쉽지만, 연산 속도가 느림
# 함수 불러오기
from sklearn.preprocessing import MinMaxScaler
# 정규화
scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
# 결측치 채우기(선형 보강법)
data.interpolate(method='linear', inplace=True)
plt.figure(figsize=(6,3))
plt.boxplot(x_train, vert=False, labels=list(x))
plt.show()
# 최댓값, 최솟값 구하기
x_min = x_train.min()
x_max = x_train.min()
# 정규화
x_train = (x_train - x_min) / (x_max - x_min)
x_test = (x_test - x_min) / (x_max - x_min)
# 모듈 불러오기
from sklearn.preprocessing import MinMaxScaler
# 정규화
scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
x_train
MinMaxScaler()를 사용하면, 데이터프레임이 아닌 np array가 되기때문에 무엇이 어떤 값인지 알 수 없다. => 더이상 데이터를 분석해 볼 수 없다.
- 엔트로피는 0~1 사이의 값
- 순수하게 분류되면 : 0
- 완벽하게 섞이면 : 1
# 시각화 모듈 불러오기
from sklearn.tree import plot_tree
fig = plt.figure(figsize=(12, 10))
plot_tree(model,
filled=True,
feature_names=list(x),
class_names=['setosa', 'versicolor', 'virginica'],
fontsize=10)
plt.show()
# 시각화 모듈 불러오기
from sklearn.tree import export_graphviz
# 이미지 파일 만들기
export_graphviz(model, # 모델 이름
filled=True,
feature_names=list(x),
class_names=['setosa', 'versicolor', 'virginica'], #임의값
rounded=True, #소수점
precision=3, #소수점
out_file='tree.dot')
!dot tree.dot -Tpng -otree.png -Gdpi=300
# 이미지 파일 로딩
from IPython.display import Image
Image(filename='tree.png', width=600)
# 변수 중요도 시각화
plt.figure(figsize=(6, 8))
plt.barh(list(x), model.feature_importances_)
plt.ylabel('Features')
plt.xlabel('Importances')
plt.show()
# 1단계: 불러오기
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix, classification_report
# 2단계: 선언하기 (파라미터)
model = DecisionTreeClassifier(random_state=1,max_depth=5)
# 3단계: 학습하기
model.fit(x_train, y_train)
# 4단계: 예측하기
y_pred = model.predict(x_test)
# 5단계 평가하기
print(confusion_matrix(y_test,y_pred))
print(classification_report(y_test,y_pred))
# 시각화 모듈 불러오기
from sklearn.tree import export_graphviz
from IPython.display import Image
# 이미지 파일 만들기
export_graphviz(model, # 모델 이름
out_file='tree.dot', # 파일 이름
feature_names=x.columns, # Feature 이름
class_names=['die', 'survived'], # Target Class 이름
rounded=True, # 둥근 테두리
precision=2, # 불순도 소숫점 자리수
filled=True, # 박스 내부 채우기
max_depth=3 # 보이는 depth
)
# 파일 변환
!dot tree.dot -Tpng -otree.png -Gdpi=300
# 이미지 파일 표시
Image(filename='tree.png')
# 변수 중요도
plt.figure(figsize=(5, 5))
plt.barh(y=list(x), width=model.feature_importances_)
plt.show()