728x90
반응형
※ 본내용은 퇴근후딴짓 강의를 참고하였습니다.
# 라이브러리 및 데이러 불러오기
import pandas as pd
# 와인 데이터 로드
from sklearn.datasets import load_wine
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
df.head()
https://bit.ly/3H64wpG
에러1. 스케일링
# 에러 코드
import pandas as pd
from sklearn.datasets import load_wine
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
from sklearn.preprocessing import MinMaxScaler
scale = MinMaxScaler()
print(scale.fit_transform(df['alcohol']))
print(scale.fit_transform(df[['alcohol']]))
# # ValueError: Expected 2D array, got 1D array instead
- sklearn을 통한 스케일링 작업시 2D 데이터 입력 필요
- 일반적으로 cols = ['a컬럼','b컬럼'] 와 같은 리스트 형태를
- 스케일링 할때 scale.fit_transform(df[cols])와 같이 넣다보니 2D (데이터 프레임 ) 형태 인지 모를 수 있음
- df['alcohol']는 1D(시리즈) 형태이며, df[['alcohol']] 대괄호를 두번 해야 2D(데이터 프레임) 형태임
# 풀이 코드
from sklearn.preprocessing import MinMaxScaler
scale = MinMaxScaler()
print(scale.fit_transform(df[['alcohol']]))
에러2. 괄호
# 에러 코드
import pandas as pd
from sklearn.datasets import load_wine
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
print(df.head()
# SyntaxError: unexpected EOF while parsing
- 괄호를 개수가 맞지 않는 경우 에러 발생함
- 코랩에서는 정확한 위치를 찍어주지만
- 시험환경에서는 line 번호 와 SyntaxError: unexpected EOF while parsing를 띄움
- 특히 마지막에 print문으로 감싸면서 괄호 수가 맞지 않는 일이 빈번함
# 풀이 코드
print(df.head())
에러3. 모델 학습 (결측치)
# 에러코드
import pandas as pd
import numpy as np
from sklearn.datasets import load_wine
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
# 결측치 생성
df.iloc[:3,0] = np.nan
print(df.head())
# 에러 수정코드 작성(결측치 처리)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, _ = train_test_split(df.drop('target',axis=1),
df['target'],
test_size=0.2,
random_state=2022)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_train, y_train)
model.predict(X_test)
# ValueError: Input contains NaN, infinity or a value too large for dtype('float32').
- 결측치 처리 필요함
# 에러코드
import numpy as np
from sklearn.datasets import load_wine
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
# 결측치 생성
df.iloc[:3,0] = np.nan
print(df.head())
# 에러 수정코드 작성(결측치 처리)
df['alcohol'] = df['alcohol'].fillna(df['alcohol'].median())
print(df.head())
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, _ = train_test_split(df.drop('target',axis=1),
df['target'],
test_size=0.2,
random_state=2022)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_train, y_train)
model.predict(X_test)
# ValueError: Input contains NaN, infinity or a value too large for dtype('float32').
에러4. 모델 학습 (데이터(row) 크기 다를 때)
# X_train, y_train, X_test 3개 파일이 주어졌을 때
import pandas as pd
from sklearn.datasets import load_wine
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, _ = train_test_split(df.drop('target',axis=1),
df['target'],
test_size=0.2,
random_state=2022)
# 만약 'proline'컬럼의 값이 1500 일때 이상치라고 판단해 삭제 했다면?
print("1500이상인 데이터 수:", sum(X_train['proline'] >= 1500))
X_train = X_train[X_train['proline'] < 1500]
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_train, y_train)
# ValueError: Found input variables with inconsistent numbers of samples: [138, 142]
- X_train의 데이터 수는 138이며, y_train의 데이터 수는 142개임
- X_train의 데이터에서 삭제를 할 때는 y_train에 반영을 해주거나 pd.concat을 통해 데이터를 합쳐서 전처리함
- train을 삭제했다면 test도 같이해줘얗!!!
# 풀이 코드
# X_train, y_train, X_test 3개 파일이 주어졌을 때
from sklearn.datasets import load_wine
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, _ = train_test_split(df.drop('target',axis=1),
df['target'],
test_size=0.2,
random_state=2022)
# 만약 'proline'컬럼의 값이 1500 일때 이상치라고 판단해 삭제 했다면?
print("1500이상인 데이터 수:", sum(X_train['proline'] >= 1500))
# 삭제할 데이터의 인덱스 값을 구하고 drop함수를 통해 삭제
ind = X_train[X_train['proline'] >= 1500].index
print("삭제할 index:", ind)
X_train = X_train.drop(ind) # 기본값 axis = 0
y_train = y_train.drop(ind)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_train, y_train)
에러5 모델 학습 (컬럼의 크기 다를 때)
# 에러코드
import pandas as pd
from sklearn.datasets import load_wine
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, _ = train_test_split(df.drop('target',axis=1),
df['target'],
test_size=0.2,
random_state=2022)
print("컬럼 추가 전:", X_train.shape, X_test.shape)
# 임의 데이터 추가 및 원핫인코딩
X_train = pd.get_dummies(X_train, columns=['alcohol'])
X_test = pd.get_dummies(X_test, columns=['alcohol'])
print("컬럼 추가 후:",X_train.shape, X_test.shape)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_train, y_train)
model.predict(X_test)
# ValueError: X has 13 features, but RandomForestClassifier is expecting 14 features as input.
- RandomForestClassifier 모델은 14개의 컬럼이 입력되어야 하는데 13개의 컬럼만 있는 데이터를 입력함
- 데이터 전처리 & 피처 엔지니어링 에서 train데이터만 처리 했거나
- 원핫 인코딩 시 train과 test의 카테고리가 달라 주로 발생하는 현상
# 풀이 코드
from sklearn.datasets import load_wine
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, _ = train_test_split(df.drop('target',axis=1),
df['target'],
test_size=0.2,
random_state=2022)
print("컬럼 추가 전:", X_train.shape, X_test.shape)
# 데이터 합친 후 새 컬럼 추가
all_data = pd.concat([X_train, X_test]) # 기본 axis=0
all_data = pd.get_dummies(all_data, columns=['alcohol'])
# 데이터 전처리 후 다시 분리
X_train = all_data.iloc[:X_train.shape[0],:]
X_test = all_data.iloc[X_train.shape[0]:,:]
print("컬럼 추가 후:",X_train.shape, X_test.shape)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_train, y_train)
model.predict(X_test)
에러6.데이터 값을 변경했을 때 나타나는 경고
# 에러 코드
import pandas as pd
from sklearn.datasets import load_wine
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
cols = ['alcohol','malic_acid']
df2 = df[cols]
df2.iloc[0,:] = 999
print(df.head())
# SettingWithCopyWarning
- 에러는 아니지만 경고문이 발생됨.
- 데이터를 복사한 후 복사한 변수에 데이터 변경할 때 나타남
- 데이터 프레임을 복사할 때는 copy()함수를 써서 옮길 것!
# 에러 코드
from sklearn.datasets import load_wine
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
cols = ['alcohol','malic_acid']
df2 = df[cols].copy()
df2.iloc[0,:] = 999
print(df.head())
# SettingWithCopyWarning
에러8. 예측
# 에러코드
import pandas as pd
from sklearn.datasets import load_wine
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
# 시험 상황에서 X_train, X_test, y_train이 주어진 상태임
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, _ = train_test_split(df.drop('target',axis=1),
df['target'],
test_size=0.2,
random_state=2022)
# 검증 데이터를 만들기 위해 train_test_split
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(X_train,
y_train,
test_size=0.15,
random_state=2022)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_tr, y_tr)
pred = model.predict(X_val)
print(pd.DataFrame({'id':X_test.index, 'X_test':pred}))
# ValueError: arrays must all be same length
- 검증용 데이터를 제출하려고 해서 X_test.index 데이터 길이가 맞지 않다고 에러가 나타남
# 풀이 코드
from sklearn.datasets import load_wine
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
df['target'] = wine.target
# 시험 상황에서 X_train, X_test, y_train이 주어진 상태임
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, _ = train_test_split(df.drop('target',axis=1),
df['target'],
test_size=0.2,
random_state=2022)
# 검증 데이터를 만들기 위해 train_test_split
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(X_train,
y_train,
test_size=0.15,
random_state=2022)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_tr, y_tr)
pred = model.predict(X_test)
print(pd.DataFrame({'id':X_test.index, 'X_test':pred}))
에러9. 오타에러
- 단순 오타
- ''따옴표 실수
- 대소문자 구분(예약어)
- 에러10. 정확한 철자가 기억이 나지 않을 때
- dir / __ all __ / help
import sklearn
print(sklearn.__all__)
import sklearn.model_selection
print(sklearn.model_selection.__all__)
import pandas as pd
dir(pd)
728x90
'IT&게임 > 빅데이터분석기사(빅분기)' 카테고리의 다른 글
인코딩 정리(원핫인코딩/레이블인코딩) (0) | 2024.06.18 |
---|---|
작업형2 유형 참고(lightBGM-분류/회귀) (0) | 2024.06.18 |
빅데이터분석기사 제2유형 : 회귀문제 예제1 (0) | 2024.06.07 |
빅데이터분석기사 제2유형 : 분류문제 예제1 (0) | 2024.06.07 |
빅데이터분석기사 제2유형 : ⑥ 평가지표 (0) | 2024.06.06 |
댓글