인프런 커뮤니티 질문&답변

조경현님의 프로필 이미지
조경현

작성한 질문수

핸즈온 머신러닝 2

128페이지의 코드에 대해 질문하고 싶습니다:)

작성

·

255

0

안녕하세요!

128페이지의 코드를 그대로 써서 진행하였는데 오류가 나서 이렇게 질문드립니다.

128페이지의 마지막 코드를 그대로 진행하니 some_digit = X[0] 부분에서 오류가 나며 KeyError: 0 이 뜨게 되었습니다.

import matplotlib as mpl
import matplotlib.pyplot as plt

some_digit = X.loc[0]
some_digit_image = some_digit.values.reshape(28, 28)  # ndarray

plt.imshow(some_digit_image, cmap="binary")
plt.axis("off")
plt.show()

위의 코드는 제가 X.loc[0]으로 하니 some_digit이 series로 반환되어 some_digit_image에서 some_digit.values.reshape()으로 하는 방식을 취하여 새로 작성한 코드입니다. (결과는 동일하게 나온 것 같았습니다!)

 

128페이지 뿐만 아니라 132페이지의 코드에서도 비슷한 일이 일어났는데,

from sklearn.model_selection import StratifiedKFold
from sklearn.base import clone

skfolds = StratifiedKFold(n_splits=3, random_state=42, shuffle=True)

for train_index, test_index in skfolds.split(X_train, y_train_5):
    clone_clf = clone(sgd_clf)
    X_train_folds = X_train.loc[train_index]
    y_train_folds = y_train_5.loc[train_index]
    X_test_fold = X_train.loc[test_index]
    y_test_fold = y_train_5.loc[test_index]

    clone_clf.fit(X_train_folds, y_train_folds)
    y_pred = clone_clf.predict(X_test_fold)
    n_correct = sum(y_pred == y_test_fold)
    print(n_correct / len(y_pred))

본래의 코드는 X_train_folds, y_train_folds, X_test_fold, y_test_fold를 지정할 때 loc이 붙지 않는 코드였지만 이것 또한 위의 상황과 비슷하게 인덱싱이 잘못되었다고 나오며 loc를 붙이니 진행이 되었습니다.

왜 이런 상황이 발생하는지, 계속 이러한 방식으로 인덱싱을 해야 하는 것인지 여쭤보고 싶습니다:)

답변 2

0

박해선님의 프로필 이미지
박해선
지식공유자

안녕하세요. 박해선입니다.

아, fetch_openml 함수를 그대로 사용하신 것 같군요. 사이킷런 0.24버전부터 fetch_openml 함수가 기본적으로 데이터프레임을 반환하기 때문에 as_frame 매개변수를 Fasle로 지정해야 합니다. 블로그의 에러타 페이지(https://tensorflow.blog/handson-ml2/)의 105번을 참고하세요.

감사합니다.

조경현님의 프로필 이미지
조경현
질문자

아하 애초에 판다스 데이터프레임이면 안 되는 거였군요...!!!

감사합니다!! 다시 한번 시도해보겠습니다:)

0

박해선님의 프로필 이미지
박해선
지식공유자

안녕하세요. 박해선입니다.

이는 판다스 데이터프레임이기 때문입니다. loc 메서드에 대한 온라인 문서(https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html)와 간단한 판다스 튜토리얼(https://ml-ko.kr/homl2/tools_pandas.html)을 참고하세요. 

온라인 검색으로도 판다스 데이터프레임에 관한 많은 자료를 찾아 보실 수 있습니다.

감사합니다!

조경현님의 프로필 이미지
조경현
질문자

답변 정말 감사합니다!

말씀해 주신대로 튜토리얼을 확인해보니, 판다스 데이터프레임도 일반 배열처럼 정수 인덱스를 사용하여 원소에 접근할 수 있다고 나와있었습니다! 그런데 저의 코드에서는 X[0]과 같은 정수 인덱스를 사용하면 KeyError가 뜨게 되는데, 혹시 왜 이런 것인지 알 수 있을까요?

또한 X를 보았을 때 colums는 'pixel1'이나 'pixel2'같이 되어 있고, row는 0, 1 이런 식으로 되어 있는 것을 확인 할 수 있었는데, X['pixel1']은 실행이 되었으나 X['0']은 오류가 발생했습니다. 이것에 대한 이유도 설명해주시면 정말 감사드리겠습니다...!

박해선님의 프로필 이미지
박해선
지식공유자

안녕하세요. https://ml-ko.kr/homl2/tools_pandas.html 에 있는 행 참조하기 절을 참고하세요. 데이터프레임의 행은 iloc 메서드를 사용해야 합니다. 감사합니다.

조경현님의 프로필 이미지
조경현
질문자

아하 감사합니다!

마지막으로 한가지만 더 질문드리겠습니다...!!ㅠㅠ

데이터프레임의 행은 iloc 메서드를 사용해야 하는 것은 이해하였는데, 그렇다면 책의 X[0]은 오류가 날 수밖에 없는 것인가요??

조경현님의 프로필 이미지
조경현

작성한 질문수

질문하기