본문 바로가기
IT&게임/빅데이터분석기사(빅분기)

[빅분기] 여러가지 에러 케이스

by 푸루루 2024. 6. 18.
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

댓글