이번에는 머신러닝을 배웠다
강사님은 이장래 강사님이셨다! 정말 재밌고, 쉽게 말씀해주셔서 이해가 정말 잘됐다
이번에 배운것을 정리해보고자 한다.
#결측치 확인 방법
titanic.isna().sum()
#행 제거
titanic.dropna(axis=0,inplace=True)
#열 제거
titanic.dropna(axis=1,inplace=True)
#특정값으로 채우기
##평균값으로 구하기
mean=titanic['Age'].mean()
##NaN을 평균값으로 채우기
titanic['Age'].fillna(mean,inplace=True)
#앞뒤 값으로 채우기
air['Ozone'].fillna(method='ffill',inplace=True)
air['Ozone'].fillna(method='bfill',inplace=True)
#선형 보간법으로 채우기
air['Ozone'].interploate(method='linear',inplace=True)
결측치 확인 방법 : data.isna().sum()
평균값으로 채우기 : 평균값 먼저 구하고 data.fillna(평균값 변수,inplac=True)
앞뒤 값으로 채우기
선형 보간법으로 채우기
#가변수하고 싶은 칼럼들 리스트로 선언
dumm_cols=['변수1','변수2','변수3']
x=pd.get_dummies(data,columns=dumm_cols,drop_first=True,dtype=int)
#타겟값 설정
target='변수명'
x=data.drop(columns=target,inplace=True)
y=data.loc[:,target]
data.corr(numeric_only=True).style.background_gradient()
지도학습
-학습대상이 되는 데이터에 정답을 주어 규칙성 즉, 패턴을 배우게 하는 학습 방법
비지도 학습
강화학습
데이터 분리
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=1)
model=사용하고 싶은 모델 선언()
#모델 훈련
model.fit(x_train,y_train)
#예측값
y_pred=model.predict(x_test)
값을 예측
정확한 값을 예측하기 어렵기 떄문에 실제값과 예측값의 차이를 확인
오차를 하나의 값으로 나타낼때 모델에 대해 설명하기 쉬움
SST=SSR+SSA
MSE,RMSE,MPE -> 작을수록 좋음
R2 Score -> 클수록 좋음
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_absolute_percentage
from sklearn.metrics import mean_squared_error
from sklearn.metrics import root_mean_squared_error
from sklearn.metrics import r2_score
print(mean_absolute_error(y_test,y_pred))
print(r2_score(y_test,y_pred))
최선의 회귀모델 -> 전체 데이터의 오차합이 최소
결국 오차값이 최소가 되는 가중치(기울기), 편향(y절편) 찾기
- .coef,intercept
from sklearn.metrics import confusion_matrix
from sklearn.metrics import f1_score
from sklearn.metrics import classification_report
K개의 값에 따라 다르게 예측할 수 있기 때문에 최적의 K값을 찾는 것이 중요하다
from sklearn.preprocessing import MinMaxScaler
from sklearn.negihbors import KNeighborsRegressor
from sklearn.metrics import mean_absoulte_error,r2_score
#데이터 스케일링
scaler=MinMaxScaler
x_train_s=x_train.fit_scaler(x_train)
x_test_s=scaler.transform(x_test)
#선언
model=KNeighborsRegressor
#학습
model.fit(x_train_s,y_train)
#예측
y_pred=model.predict(x_test)
#평가
print(mean_absolute_error(y_test,y_pred))
print(r2_score(y_test,y_pred))
#예측값,실젯값 시각화
plt.plot(y_test.values,label='Actual')
plt.plot(y_pred,label='Predicted')
plt.legend()
plt.ylabel()
plt.show
분류, 회귀에 모두 가능
스케일링 등 전처리 필요 x
분석 과정이 직관적, 이해하기 쉬움(설명하기 쉬움)
의미있는 질문하기가 중요
과적합되기가 쉽기 때문에 가지치기가 장요
분류
회귀
순도가 높을수록 분류가 잘 된것
DT는 불순도가 낮은 속성으로 결정됨
지니 불순도 : 1-(양성클래스^2-음성클래스^2)
특징
엔프로피 : -음성비율log2(음성비율)-양성비율log2(양성비율)
정보 이득
#라이브러리 임포트
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix,classification_report
#모델선언
model=DecisionTreeClassifier()
#모델학습
model.fit(x_train,y_train)
#예측값 구하기
y_pred=model.predict(x_test)
#성능
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) # 박스 내부 채우기#시각화할 깊이
# 파일 변환
!dot tree.dot -Tpng -otree.png -Gdpi=300
# 이미지 파일 표시
Image(filename='tree.png')
#중요도 시각화
# 데이터프레임 만들기
df = pd.DataFrame()
df['feature'] = list(x)
df['importance'] = model.feature_importances_
df.sort_values(by='importance', ascending=True, inplace=True)
# 시각화
plt.figure(figsize=(5, 5))
plt.barh(df['feature'], df['importance'])
plt.show()
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report,confusion_matrix
model=LogisticRegression()
model.fit(x_train,y_train)
y_pred=model.predict(x_test)
# 5단계: 평가하기
print(classification_report(y_test,y_pred))
print(confusion_matrix(y_test,y_pred))
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
#선언하기
model=DecisionTreeClassifier(max_depth=5,random_state=1)
#검증하기
cv_score=cross_val_score(model,x_train,y_train,cv=10)
print(cv_score.mean())#정확도
print(cv_score.std())# 표준편차
from sklearn.model_selection import GridSearchCV
# 파라미터 선언
# max_depth: range(1, 51)
param={'max_depth':range(1,51)}
# Grid Search 선언
# cv=5
# scoring='accuracy'
model = GridSearchCV(DecisionTreeRegressor(), #기본 모델
param,#파라미터 범위
cv=5, #k 분활개수
scoring='accuracy' #평가지표
)
from sklearn.model_selection import RandomSearchCV
# 파라미터 선언
# max_depth: range(1, 51)
param={'max_depth':range(1,51)}
# Grid Search 선언
# cv=5
# scoring='accuracy'
model = RandomSearchCV(DecisionTreeRegressor(), #기본 모델
param,#파라미터 범위
cv=5, #k 분활개수
scoring='accuracy' #평가지표
)
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
print('최적 파라미터:',model.best_params_)
print('최고 성능:',model.best_score_)
# 변수 중요도 시각화
plt.figure(figsize=(5,5))
plt.barh(list(x),width=model.best_estimator_.feature_importances_)
plt.show()
# 불러오기
from imblearn.under_sampling import RandomUnderSampler
# Under Sampling
under_sample = RandomUnderSampler()
u_x_train, u_y_train = under_sample.fit_resample(x_train, y_train)
# 확인
print('전:', np.bincount(y_train))
print('후:', np.bincount(u_y_train))
# 불러오기
from imblearn.over_sampling import SMOTE
# Over Sampling
smote = SMOTE()
s_x_train, s_y_train = smote.fit_resample(x_train, y_train)
# 확인
print('전:', np.bincount(y_train))
print('후:', np.bincount(s_y_train))
# 선언하기
model = RandomForestClassifier(max_depth=5, random_state=1, class_weight='balanced')
학교에서 배운 내용이 많았기 때문에 복습하자는 차원에서 들었는데 오히려 새롭게 알게된 내용이 많아서 당황했다. 내가 지금까지 대충 알고 있었구나라는 생각도 들었다. 아직 부족한 점이 많지만 너무 유익한 시간이었다.
내일 미니프로젝트를 진행하는데 팀원분들에게 많은 도움이 되고 싶다
머신러닝은 하면 할수록 재밌는 기분이다!
더 깊숙히 배우고 싶다!!!