작성
·
62
0
안녕하세요!
작업형 3번중 종속변수 말고
범주형 변수에는 C()를 다 붙여도 된다고 하셨는데
수강생 작성
model = logit("Survived~ C(Gender) + C(SibSp) + C(Parch) + C(Fare)", data=df).fit()
print(model.summary())
로 작성하게 되면 에러가 발생합니다!
혹시 이유를 알 수 있을까요?
에러는 참고로 남기겠습니다!
> Warning: Maximum number of iterations has been exceeded.
Current function value: inf
Iterations: 35
Makefile:6: recipe for target 'py3_run' failed
make: *** [py3_run] Error 1
/usr/local/lib/python3.12/site-packages/statsmodels/discrete/discrete_model.py:2385: RuntimeWarning: overflow encountered in exp
return 1/(1+np.exp(-X))
/usr/local/lib/python3.12/site-packages/statsmodels/discrete/discrete_model.py:2443: RuntimeWarning: divide by zero encountered in log
return np.sum(np.log(self.cdf(q * linpred)))
Traceback (most recent call last):
File "/goorm/Main.out", line 23, in <module>
model = logit("Survived ~ C(Gender) + C(SibSp) + C(Parch) + C(Fare)", data=df).fit()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/statsmodels/discrete/discrete_model.py", line 2601, in fit
bnryfit = super().fit(start_params=start_params,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/statsmodels/discrete/discrete_model.py", line 243, in fit
mlefit = super().fit(start_params=start_params,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/statsmodels/base/model.py", line 582, in fit
Hinv = np.linalg.inv(-retvals['Hessian']) / nobs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/numpy/linalg/linalg.py", line 561, in inv
ainv = umathlinalg.inv(a, signature=signature, extobj=extobj)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/numpy/linalg/linalg.py", line 112, in raiselinalgerror_singular
raise LinAlgError("Singular matrix")
numpy.linalg.LinAlgError: Singular matrix
강사님 작성
model = logit("Survived ~ C(Gender) + SibSp + Parch + Fare", data=df).fit()
print(model.summary())
에러없음
답변 2
0
범주형 변수에는 C()를 다 붙여도 된다고 하셨는데 -> 로지스틱 회귀분석에서는 이런말을 한 기억이 없는데 어디서 이런 말을 했을까요?(강의 시간대를 알려주실 수 있을까요?)
회귀분석이나 로지스틱회귀분석에서 C()는 문제에서 해당컬럼이 범주형이라고 명시했을 때만 붙여주세요
0
안녕하세요, 인프런 AI 인턴입니다. 루루님께서 문의 주신 logit 범주형 C() 처리 문제에 대해 설명해드리겠습니다.
범주형 변수에 C()
를 사용하는 것은 데이터 분석 과정에서 범주형 변수를 명시적으로 처리하기 위함입니다. 그러나 모든 변수에 C()
를 임의로 사용하면 문제가 발생할 수 있습니다.
특히 에러 메시지에 나타난 Singular matrix
는 모델 피팅 과정에서 독립변수들 간에 선형 독립성을 잃는 경우 발생합니다. 즉, 독립변수 중 일부가 다른 변수의 조합으로 설명 가능해져서 행렬이 단수가 됩니다. 이런 상황에서 가장 흔한 원인은 범위가 작거나 정보가 중복되는 데이터를 가진 변수를 불필요하게 C()
로 감싸는 경우입니다.
명확한 범주형 변수만 C()로 처리: 예를 들어, Gender
는 명확한 범주형이므로 C()
로 처리해야 하지만, SibSp
, Parch
, Fare
는 이미 수치형으로 간주되며, 필요에 따라서는 수치형 그대로 분석해야 하는 경우가 많습니다.
변수의 도메인 지식 활용: 데이터에 대한 배경 지식을 바탕으로 범주형인지 수치형인지를 명확히 해야 합니다.
경고 메시지 주의: 경고 메시지에서 언급되듯이, iteration
이 비정상적으로 많거나 overflow, divide by zero 같은 문제가 나타날 때는 변수의 변환이나 모델의 설정을 재검토해야 합니다.
데이터 전처리 확인: 누락값, 극단값 또는 전처리 과정의 실수로 인해 변수가 불필요하게 단수가 될 수 있는지 확인해 보세요.
더 깊이 있는 학습을 원하신다면, 기존에 대한 질문들을 참고하시면 좋을 것 같습니다. 관련 유사 질문으로는:
해당 질문들은 범주형 변수 처리와 관련된 더욱 풍부한 설명과 해결책 제공에 도움이 될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
이원 분산 분석중에서
anova 테이블
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
model = ols('토마토수 ~ C(종자) + C(비료) + C(종자):C(비료)', data=df).fit()
anova_lm(model)
이 코드로 말씀하셨었습니다 !
logit이랑은 다르게 말씀하신거면 제가 잘못 기억하고있었던것같습니다.
강의중 말씀하셨던 부분은 종속변수는 수치형 변수니 C()로 감쌀 필요 없고,
독립변수에는 범주형 데이터가 있을때는 모두 다 감싸는게 안전할것같다고 말씀해주셨습니다.
이원분산분석도 회귀분석파트라고 생각했는데 아니였다면 제가 이해를 잘 못한것같습니다.
이 부분 답글 주시면 다시 공부해두겠습니다..