회귀: 연속형 데이터를 예측, 특정 값을 예측, 주관식
분류: 범주형 데이터를 예측, 객관식
군집화: 비슷한 특성을 가진 데이터를 그룹으로 나눔
차원축소: 많은 변수를 가장 잘 설명하는 핵심 변수들로 압축
회귀모델 종류
1. 선형회귀(Linear Regression)
2. 릿지회귀(Ridge Regression)
3. 라쏘회귀(Lasso Regression)
4. 엘라스틱넷 회귀
성능평가
숫자가 작을수록 좋음!!
데이터 수집 -> 전처리 -> 분할 -> 모델 선택 및 학습 -> 예측 및 평가
범주형 데이터 수치화
from sklearn.preprocessing import LabelEncoder
col_lst = ['sex', 'smoker', 'region']
for col in col_lst:
encoder = LabelEncoder() #for문 전에 정의해도 됨
df[col] = encoder.fit_transform(df[col])
#col_lst에 있는 것을 하나씩 데려와서 인코딩후 df[col]에 집어넣기
df.head()
MinMaxScaler를 통해 정규화
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df_scaled = scaler.fit_transform(df)
df2 = pd.DataFrame(data=df_scaled)
df2
데이터 수집 -> 전처리 -> 분할 -> 모델 선택 및 학습 -> 예측 및 평가
x = df_scaled[:, :-1 ] #charges 제외하고 나머지 열 데려오기
y = df_scaled[:,-1] #charges가 마지막이니까 -1로 불러오고 행은 전체행을 들고옴
# print(x.shape)
# print(y.shape)
# print(df_scaled.shape) 잘 분리되었는지 확인
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=123)
print(x_train.shape)
print(x_test.shape)
print(y_train.shape)
print(y_test.shape)
데이터 수집 -> 전처리 -> 분할 -> 모델 선택 및 학습 -> 예측 및 평가
LinearRegression()
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x_train, y_train)
데이터 수집 -> 전처리 -> 분할 -> 모델 선택 및 학습 -> 예측 및 평가
pred = model.predict(x_test)
from sklearn.metrics import mean_absolute_error, mean_squared_error
mae = mean_absolute_error(y_test, pred)
mse = mean_squared_error(y_test, pred)
print(mae)
print(mse)
결과 비교
LinearRegression()
mae - 0.06198111675647074
mse - 0.00791154927917929
RandomForestRegressor() - best!
mae: 0.041299882928715635
mse: 0.004578017406251179
Ridge()
mae: 0.061969787859531965
mse: 0.007948477943010365
Lasso()
mae: 0.14602329437451125
mse: 0.03940553701157805
여기서는 랜덤포레스트가 가장 성능이 좋음!
분류모델 종류
1. 로지스틱 회귀(Logistic Regression) - 이진분류에만 사용!!!
2. 결정트리 (Decision Tree)
3. 랜덤포레스트 (Random Forest)
4. XGBoost
성능 평가
1. 오차행렬 - 예측범주, 실제 분류 범주를 교차표로 정리
정확도 - 모델이 전체 문제 중에서 정답을 맞춘 비율
재현율 - 실제로 정답이 positive인 것들 중에서 모델이 positive라고 예측한 비율
ex)
실제 -> 장애O 예측 -> 장애X
실제 -> 장애X 예측-> 장애O
둘중 전자가 중요함 !!!!!! (2번칸) 2번값 낮춰야함!!!
정밀도 - 모델이 positive라고 예측한 것들 중에서 실제로 정답이 positive인 비율
ex) 스팸메일분류기
스팸메일분류해서 스팸메일함으로 가는걸 원함
실제 -> 스팸X 예측 -> 스팸O
실제 -> 스팸O 예측 -> 스팸X
전자가 더 위험(3번칸)
3번의 비율을 낮춰야
1/(1+3) = 정밀도
1번의 비율을 높이는 것이 중요
데이터 수집 -> 전처리 -> 분할 -> 모델 선택 및 학습 -> 예측 및 평가
x = x.iloc[:, 1:] #이전 파일은 numpy객체(array)였기 때문에 변수에 그냥 [:, 1:]붙여서 사용하면 되는데 df는 iloc사용
y = y.iloc[:, 1]
print(x.shape)
print(y.shape)
cust_id가 인덱스값과 동일했기때문에 이를 변수로 받아들이면
결과가 왜곡될 수 있으니 제거하여 x,y로 분리
데이터 수집 -> 전처리 -> 분할 -> 모델 선택 및 학습 -> 예측 및 평가
LogisticRegression
오차행렬
[[621 51]
[326 52]]
정확도: 0.6409523809523809
정밀도: 0.13756613756613756
재현율: 0.5048543689320388
F1: 0.21621621621621623
DecisionTreeClassifier
오차행렬
[[532 140]
[257 121]]
정확도: 0.6409523809523809
정밀도: 0.3201058201058201
재현율: 0.5048543689320388
F1: 0.37871674491392804
RandomForestClassifier
오차행렬
[[548 124]
[266 112]]
정확도: 0.6409523809523809
정밀도: 0.2962962962962963
재현율: 0.5048543689320388
F1: 0.36482084690553745
XGBoost
오차행렬
[[529 143]
[241 137]]
정확도: 0.6409523809523809
정밀도: 0.36243386243386244
재현율: 0.5048543689320388
F1: 0.41641337386018235