[기억할 개념]
1. 선형회귀

1) 단순선형회귀: x 변수가 1개
from sklearn.linear_model import LinearRegression
model_lr = LinearRegression()
type(model_lr)
x = body_df[['Weight']]
y = body_df[['Height']]
#데이터 훈련
model_lr .fit(x = x, y = y<-이름)
#가중치(w1)
print(model_lr.coef_)
#편향(bias, w0)
print(model_lr.intercept_)
w1 = model_lr.coef_[0][0]
w0 = model_lr.intercept_[0]
print('y = {}x + {}'.format(w1.round(2), w0.round(2)))
y = 0.86x + 109.37
==> 해석 #y(키)는 x(몸무게)에 0.86을 곱한 뒤에 109.37을 더해라
2) 다중선형회귀: x 변수가 2개
#1. y= 0.86x + 109.37
#2. 위 식을 활용한 예측 칼럼 추가
#3. 에러값을 각각 계산(error)
#4. 양수를 만들기 위해 제곱화
#5. 값을 모두 더함(MSE)
#6. 그래프로 그리기
#예측값 만들기
body_df['pred'] = body_df['weight']*w1+w0
body_df.head(3)
#에러값 수식 생성 방법
body_df['error'] = body_df['height'] - body_df['pred']
body_df.head(3)
#에러값 제곱화
body_df['error^2'] = body_df['error'] * body_df['error']
body_df.head(3)
#모두 합하기 - MSE 계산 완료 10
body_df['error^2'].sum()/len(body_df)
#산점도 그래프에 선형식을 만들어 그래프로 그리기
sns.scatterplot(data = body_df, x = 'weight', y = 'height')
sns.lineplot(data = body_df, x = 'weight', y = 'pred', color = red)
#7. 선형회귀 평가
1) 회귀 숫자를 맞추는 방법: MSE(수동계산 10)
2) R Square 값: 평균 대비 설명력(신뢰도), 0이면 제일 낮은 것, 1에 가까울수록 높은 것 => 높을수록 좋음
from sklearn.metrics import mean_squared_error, r2_score
#r2_score <=R Square
#평가함수는 공통적으로 정답(실제 true), 예측값(pred)
y_true = body_df['height']
y_pred = body_df['pred']
mean_squared_error(y_true, y_pred) or r2_score(y_true, y_pred)
#8. 더 간단히 평가하는 방법
#예측값 함수 지정
y_pred2 = model_lr.predict(body_df[['weight']]
y_pred2
#에러값 함수 지정
mean_squared_error(y_true, y_pred2)

- 수치형 데이터
1. 연속형 데이터: 두 개의 값이 무한한 개수로 나누어진 데이터 (ex. 키, 몸무게)
2. 이산형 데이터: 두 개의 값이 유한한 개수로 나누어진 데이터 (ex. 주사위 눈, 나이) - 범주형 데이터
1. 순서형 자료: 자료의 순서 의미가 있음 (ex. 학점, 등급)
2. 명목형 자료: 자료의 순서 의미가 없음 (ex. 혈액형, 성별) - 머신러닝 모델에 데이터를 훈련시키려면 해당(범주형) 데이터를 숫자로 변경하는 과정 필요
성별, 날짜와 같은 데이터를 범주형 데이터라고 부르며, 이를 임의로 0,1등에 숫자로 바꿈 => Encoding
2. 로지스틱 회귀
: 확률이 증가할수록 (좌) 오즈비는 급격히 발산, (우) 로짓은 완만하게 증가


1) 정확도와 F1-Score
: 실제 값과 예측 값에 대한 모든 경우의 수를 표현하기 위한 2x2 행렬

- TP: 실제로 양성(암 환자)이면서 양성(암 환자) 올바르게 분류된 수
- FP: 실제로 음성(정상인)이지만 양성(암 환자)로 잘못 분류된 수
- FN: 실제로 양성(암 환자)이지만 음성(정상인)으로 잘못 분류된 수
- TN: 실제로 음성(정상인)이면서 음성(정상인)으로 올바르게 분류된 수
2) 정밀도(Precision): 모델이 양성 1로 예측한 결과 중 실제 양성의 비율(모델의 관점)

3) 재현율(Recall): 실제 값이 양성인 데이터 중 모델이 양성으로 예측한 비율(데이터의 관점)

4) f1-score: 정밀도와 재현율의 조화 평균

5) 정확도(Accuracy)

6) 단순 로지스틱 회귀
#[타이타닉 컬럼 분류]
#숫자: Age, SibSp, Parch, Fare
#범주형: Pclass, Sex, Cabin, Embarked
#=> x 변수 1개 설정, y변수(Survived)
#x변수: Fare, y변수: Survived
X_1 = titaninc_df[['Fare']]
y_true = titaninc_df[['Survived']]
#로지스틱회귀 산점도 1차 확인
sns.scatterplot(titaninc_df, x = 'Fare', y = 'Survived')
#히스토그램 1차 확인
sns.histplot(titaninc_df, x = 'Fare')
=> y축이 데이터 개수이기 떄문에 별도 설정 X
#데이터 기술통계 보는 법(수치형) => describe()
titaninc_df.describe()
model_lor = LogisticRegression()
model_lor.fit(X_1, y_true)
#속성값 분류 함수 생성
def get_att(x):
print('클래스 종류', x.classes_)
print('독립변수 갯수', x.n_features_in_)
print('들어간 독립변수(x)의 이름', x.feature_names_in_)
print('가중치', x.coef)
print('바이어스', x.intercept_)
get_att(model_lor)
#함수 생성 없이 바로 평가
from sklearn.metrics import accuracy_score, f1_score
def get_metrics(true, pred):
print('정확도', accuracy_score(true, pred))
print('f1-score', f1_score(true, pred))
#예측치
y_pred_1 = model_lor.predict(X_1)
y_pred_1[:10]
len(y_pred_1)
#평가
get_metrics(y_true, y_pred_1)
7) 다중회귀 로지스틱 회귀
#[타이타닉 컬럼 분류]
#숫자: Age, SibSp, Parch, Fare
#범주형: Pclass, Sex, Cabin, Embarked
#=> x 변수 1개 설정, y변수(Survived)
#Y(Survived): 생사여부
#X(수치형): Fare
#X(범주형): Pclass(좌석 등급), Sex
#데이터 전처리
def get_sex(x):
if x == 'female':
return 0
else:
return 1
titaninc_df['Sex_en'] = titaninc_df['Sex'].apply(get_sex)
titaninc_df.head(3)
#모델링
X_2 = titaninc_df[['Pclass', 'Sex_en', 'Fare']]
y_true = titaninc_df[['Survived']]
model_lor_2 = LogisticRegression()
model_lor_2.fit(X_2, y_true)
get_att(model_lor_2)
#예측값 생성
y_pred_2 = modle_lor_2.predict(X_2)
y_pred_2[:10]
#2번째 모델링
get_metrics(y_true, y_pred_2)
[정확도 비교]
#X변수가 Fare
get_metrics(y_true, y_pred_1)
#X변수가 Fare, Pclass, Sex
get_metrics(y_true, y_pred_2)
#각 데이터별 Y=1인 확률 추출 (생존할 확률)
model_lor_2.predict_proba(X_2)
model_lor_2 = 죽을 확률 / predict_proba = 살 확률
[배운 점]
- 선형회귀, 로지스틱회귀.. 뭔 소린지는 잘 모르겠지만 대충 감은 잡은 것 같음. 책으로 더 공부해야 할 듯.
- 이번 심화 프로젝트 주제 선정하는 방식이 달라진다는 풍문을 들었음. 들은 바로는 주제를 선정해서 던져준다는데..
이게 뭔 개소리..? 그럼 도메인 별로 조를 왜 짰음..?
이렇게 되면 두 가지 문제가 발생하기에 정식으로 이의제기할 예정임.
1) 주제를 한정시키면 데이터셋을 분석하다 전혀 다른 주제의 방향이 나올 수 있는데, 이럴 경우는 어떻게 할 건지?
2) 주제와 데이터셋을 주면 도메인 별로 조를 설계한 의미가 없어짐. 뭘 위해서 하는 것인지? - 지금 내 계획이 틀어지고 있어서 상당히 짜증 난 상태임.
지금 설날 연휴가 껴 있어서 그에 맞게 1주 전부터 세팅이 들어가고 있는데, 미리 대비하고 있는 조들에게는 어떤 대책을 준비하고 있는지 궁금해지고 있음.
'Python' 카테고리의 다른 글
| 3/22 - Pandas; Python 기본 세팅 csv 파일 불러오기 (0) | 2024.03.22 |
|---|---|
| 2/6 - 머신러닝모델링; 데이터 전처리_이상치(Outlier) 처리 방법 (1) | 2024.02.06 |
| 2/2 - Python; 개인과제 피드백 (0) | 2024.02.02 |
| 1/26 - Pandas&Python; 기초 문법② & 개인과제 (0) | 2024.01.26 |
| 1/25 - Pandas&Python; Python 기초 문법① (0) | 2024.01.25 |