[머신러닝 프로젝트] 4. 데이터 분할, 문자+수치형 컬럼 변환
2024. 2. 16. 23:57ㆍ회고/기타 프로젝트
01 훈련용/평가용 데이터 분할
02 abv, degree(ex. '12~14') 컬럼 전처리
- wine_average 라는 사용자 정의 함수를 제작하였다.
- pd.isnull() 만약 입력 받은 데이터가 null이면 null값으로 출력하고 함수 종료.
- split에 대한 개념을 이해하고 있어야 제작할 수 있다.
- 소수점만으로 이루어진 수치형과 문자형이 섞여 있었기에 소수점 float 변환조건도 추가했다.
- try는 예외처리 코드를 (except ValueError:) 포함한다.
- 어떠한 예외도 발생하지 않았을 때 조건의 else를 다음에 추가할 수 있지만 필요치 않았다.
- apply함수를 이용하여 데이터프레임에 하나씩 적용시켰다.
03 wine_age 의미하는 새 컬럼 생성 후 상관관계 분석
04 r^2 score 비교
05 다중공선성 체크해보고 상담
06 인사이트 (이후는 참고만)
- 다중공선성과 VIF, 선형대수학, 잔차검증을 배워야겠다.
- sort, sorted의 차이를 다시 복습할 수 있었다.
- 숫자로 이루어진 문자형 컬럼을 변환하는 과정이 매우 어렵게 느껴졌는데 코드카타 풀 듯 하나씩 천천히 해가면 어려울 것 없는 과정이었다.
- 머신러닝을 더 공부해서 다른 회귀모델로 가격을 예측해보는 게 목표이다.
07 피드백_임튜터님
1. 알코올 함량, 도수 컬럼의 처리 방법 고민하고 질문하기
: 사용자 정의 함수를 만들면 된다. 우문현답이시다.
2. 바디 타입이 상승할수록 가격도 올라간다는 분석 결과가 가격과 바디 타입의 상관성에 논리적 근거가 되겠다고 생각했는데 맞는가?
: 맞다.
3. 다중공선성 배우고 질문하기
: 다른 회귀모델(숫자예측) 랜덤포레스트
4. 피피티에는 어떤 걸 넣으면 되는지 여쭤본다. (과거 분석하고 인사이트 결과를 도출하는 과정과 현재 프로젝트의 진행 방향이 달라서 헷갈린다. 코드를 넣는 건 아닌게 맞는지?)
: 넣으면 안됨. 기존과 같음. 청자를 중심으로 발표한다고 생각한다. 코드는 말하지 마. 코드 말고 기술적인 부분을 이야기할 수 있다.
5. 알코올과 도수도 범주형에 속하나요? 난 맞다고 생각해서 여쭤본다.
1) 변수들 사이, 중간에 여러 값들이 들어갈 수 있으니까 수치형 가능.
2) 순서형 범주형으로도 가능 대신, 라벨 인코딩으로 해야 한다.
3) 숫자라서 그냥 수치형으로 했을 때, 내가 편함. 수치형으로 한다.
4) wine_age를 의미하는 year2도 수치형으로 변환해서 적용이 가능하다.
[정리]
1) 두 구간 사이에 무한대 숫자가 존재할 수 있으면 수치형 변수로 보는 게 편하다.
2) 수치형 변수는 스케일링 적용도 되니까 좋음.
3) 예를 들어, 온도 5도 ~ 10도 사이에는 무한한 숫자가 들어갈 수 있다. 수치형!
4) 순서가 있는 범주형 1, 2, 3, 4, 5, 6학년 수치형으로 보이지만 순서형 범주형 자료!
- 왜? 가운데 학년에 무한대로 들어갈 수 없으니까.
6. 다중선형회귀는 x가 여러개니까 시각화를 어떤 방법으로 그려야 할지?
: 여러 개 변수 넣으면 그래프를 못 본다. 두 개. 강한 상관관계 두개를 시도해보라.
7. 평가지수가 낮아도 VIF 체크하나요?
: 한다. 근데 여러개 넣는건 아니고 두 개 비교해보는 것을 시도해보라.
8. 피피티 제작 방법에 대한 질문
: 과정은 전처리 이런 기술적인거 얘기할 수 있다.
: 결말은 가설을 세우는 것이다.
: 모델링을 통해 실무에 어떻게 사용할것인지
: 쿠팡에 파는게 이게 적정가가 맞는지 확인용으로 쓸 수도있고
: 내가 와인을 수입해서 얼마에 파는게 적절할지 책정할 수 있다.
9. 파이썬, SQLite 연동하는 것 편리함이 이유인가?
: sql dbms는 대용량 데이터를 다룰 때 성능이 좋아서 쓴다. 학습할 땐 아니다. 파이썬이 더 편함.
08 VIF 개념 정리
1) VIF(분산팽창요인) 계산
- VIF(Variance Inflation Factor)를 계산하기 위해서는 다중 선형 회귀 모델을 사용해야 한다. VIF는 각 독립 변수가 다른 독립 변수들과 어떻게 상관되어 있는지를 나타내는 지표로, 다중공선성을 판단하는 데 사용된다.
- X_train은 독립 변수를 포함하는 데이터프레임이어야 한다. 해당 데이터프레임의 열은 독립 변수를 나타내며, 첫 번째 열은 상수항(Intercept)이 있어서는 안된다. VIF가 일반적으로 10보다 크면 다중공선성의 문제가 발생할 수 있다고 판단한다.
2) 상수항이 뭐야, 인덱스 값이야?
- 맞다. 상수항을 포함하지 않은 경우, 독립 변수의 첫 번째 열이 상수항이 된다. 이렇게 하면 모든 독립 변수가 0일 때의 종속 변수의 예측값을 나타내는데, 상수항이 있는 경우와 동일한 결과를 얻을 수 있다. 따라서 인덱스 값은 상수항이 포함되지 않은 독립 변수의 첫 번째 열에 해당하는 열의 인덱스가 된다. 만약 상수항을 추가하지 않고 회귀 모델을 학습시키는 경우, 이 첫 번째 열은 보통 인덱스 0을 갖게 된다.
3) VIF가 10이 넘으면?
- VIF(분산팽창요인)는 다중공선성을 측정하는 지표 중 하나이다. VIF 값이 10을 넘으면 다중공선성의 문제가 발생할 가능성이 높아진다고 판단한다. 다중공선성은 독립 변수 간에 강한 선형 상관 관계가 있는 경우 발생하며, 이는 회귀 모델의 예측력을 저하시킬 수 있다.
- 따라서 VIF가 10을 넘는 경우, 해당 독립 변수들 사이에 다중공선성이 있을 가능성이 높으므로 주의가 필요하다. 일반적으로 다중공선성이 높은 변수들을 제거하거나 다른 방법을 사용하여 이 문제를 해결해야 한다.
09 abv, degree 범주형 전처리하고 인사이트
1) axis=1 이란?
- DataFrame의 mean() 메서드의 기본값(default)은 axis=0입니다. 즉, 기본적으로 열(column)을 따라 연산을 수행하여 각 열의 평균을 계산합니다. 만약 axis=1을 명시하지 않으면, 기본적으로 axis=0으로 설정됩니다.
2) 코드 분석
if pd.isnull(s): return np.nan: 먼저 입력된 문자열이 NaN인지 확인한다. 만약 True라면 NaN을 반환하고 함수를 종료한다.
parts = s.split('~'): 문자열을 "~" 기준으로 나누어 parts 리스트에 저장한다. 현재 숫자 범위가 포함되어 있는 컬럼을 전처리 중이다.
if len(parts) == 2: return (float(parts[0]) + float(parts[1])) / 2: 리스트의 길이가 2라면, 즉 숫자 범위가 있는 경우에는 범위의 양 끝 값을 추출하여 평균을 계산한다.
try: return float(parts[0]) except ValueError: return np.nan: 만약 리스트의 길이가 2가 아니라면, 즉 단일 숫자일 경우에는 바로 해당 숫자를 반환한다. 그러나 만약 숫자로 변환할 수 없는 경우 (예외인 ValueError가 발생하는 경우)에는 NaN을 반환한다.
3) try:가 else:랑 같은 건가?
- 아니다. try:와 else:는 서로 다른 역할을 한다.
- try: 블록은 예외가 발생할 수 있는 코드를 포함한다. 이 블록 안에서 예외가 발생하면 파이썬은 해당 예외를 처리하기 위해 except: 블록으로 이동하게 된다.
- else: 블록은 'try:' 블록에서 예외가 발생하지 않았을 때 실행된다다. 즉, try: 블록에서 어떠한 예외도 발생하지 않았을 때, 추가적인 코드를 실행하고자 할 때 후순서로 사용된다.
- 따라서 try:와 else:는 다른 상황에서 사용된다. try:는 예외 처리를 위해 사용되고, else:는 예외가 발생하지 않았을 때 추가적인 코드를 실행하기 위해 사용된다.
4) 인사이트
- 예를 들어, a = "11~13"이 주어졌다.
: a.split('~')은 직접 배열을 바꾸지 않는다. 변수에 할당이 필요하다.
- apply(wine_average) 함수를 데이터마다 작용하는 기능이다.
: 반복해서 실행하면 오류 발생한다.
10 피드백_안튜터님
- 결측 처리된 count 1의 차이는 null + not null 하나가 잡혔을거라고.
- count를 제대로 이해해야 한다. null은 기본적으로 체크 안함. 독스 체크!
- sort()는 반환 값이 없다는 걸 알고 있었잖아. 잊지 말자.
- 선형회귀가 제일 성능을 잘 확인하기 힘들다. 랜덤 포레스트등 돌려보면 다를 것이다.
- 여러가지 변수 넣고 VIF 체크 되는데 선형대수학의 개념이해가 필요하다.
- 선형회귀모델은 잔차검증이 필수다. 안하면 신뢰도가 낮아진다.
11 피드백_수용
- 완료한 점
- 훈련용 세트는 어차피 카피한거 아닌가? 왜 훈련이랑 평가용으로 나뉘지?
- 이건 값이 달랐음. 그리고 계속 눌러도 안바뀌는 값이다.
- 가격의 널이 아니라 0을 없애는 전치를 해보고 값을 비교한다 : 같은 값이다.
- 훈련용 세트, 평가용 세트 분할 해보기 : 완료
- 훈련용 세트는 어차피 카피한거 아닌가? 왜 훈련이랑 평가용으로 나뉘지?
- 시도할 점
- year2까지 추가해서 모델 적합시키기 [완료]
- 회귀에는 다양한 게 있다. 랜덤포레스트 공부하고 도전. 응용이라 어렵지 않음.
- VIF 공부하고 두 변수간의 VIF 확인하고 비교하기
- 피피티 결과 파트에 시나리오 추가 [완료]
- 피피티에 바디 타입 평균값 점점 오르는거 추가
- 알콜/도수의 사용자 정의 함수 제작 [완료]
- 추가적인 전처리는 튜터님꺼 시도해보고 질문하기
- 범주형(naion, type)에 대해 onehot 인코딩
- 데이터셋에 스케일러 적용하기
- 다중공선성과 관련된 선형대수학의 개념이 뭐지?
- 도수 전처리보고 return 값 여러개 로직 이해하기
- 가격의 아웃라이어 제거하는 방법 학습
- log_price 사용하고 price로 변환만 해주면 괜찮다는 게 뭔지?
- 워크 플로우에 나의 코드 해석을 추가한다.
- 코드카타? 자릿수 더하면 n이 변형되어서 m을 처음에 주는게 맞나? [완료?]
- year2까지 추가해서 모델 적합시키기 [완료]
- (재)질문할 점
- null 값이 많은 데 하나만 빠진다 : count의 이해 [완료]
- answer.sort()의 타입을 확인하면 리스트인데 part변수에 할당이 안됨. [완료]
- 다중공선성 두 개씩 해보고 변수 제거해도 무조건 r^2 오르는건 아닌가?
- 선그래프 추구미가 있는데 어떻게 시각화하는지 모르겠다.
- def wine_average(x) 함수에 return많아도 괜찮은 건가? [완료]
- np.nan, pd.isnull의 이해 [완료]
- 결론을 한 두 변수를 찾는 건 아닌데, 예측이 상관도 없은 변수 찾는 게 아닌데 뭘까?
- 다중회귀분석은 여러 개 적용하는데 다중공선성은 왜 두 개씩 하지? 뭘까?
- null 값이 많은 데 하나만 빠진다 : count의 이해 [완료]
'회고 > 기타 프로젝트' 카테고리의 다른 글
[개인] 데이터 리터러시 : '공유 킥보드' 사라진 파리... 왜? (0) | 2024.03.26 |
---|---|
[개인] 수박 언제 사먹지? 선택과 집중 (feat. open api) (0) | 2024.03.21 |
[머신러닝 프로젝트] 3. 단순/다중회귀모델 결과비교 (0) | 2024.02.14 |
[머신러닝 프로젝트] 2. 워크 플로우(피드백 추가) (0) | 2024.02.14 |
[머신러닝 프로젝트] 1. 현재 상황(상담 준비 자료) (0) | 2024.02.13 |