brightics/studio

One Way ANOVA 시 에러

myunggijung opened this issue · 4 comments

JOB ID: c_0Fq9EuM3nDTKWuUD_202006041621598500
java.lang.Exception: numpy.linalg.linalg.LinAlgError: SVD did not converge

	at com.samsung.sds.brightics.agent.context.python.PythonProcessManager.run(PythonProcessManager.java:283)
	at com.samsung.sds.brightics.agent.context.python.PythonProcessManager.run(PythonProcessManager.java:240)
	at com.samsung.sds.brightics.agent.context.python.PythonContext.runFunction(PythonContext.java:72)
	at com.samsung.sds.brightics.agent.service.TaskService.executeFunction(TaskService.java:203)
	at com.samsung.sds.brightics.agent.service.TaskService.executeTaskToContext(TaskService.java:165)
	at com.samsung.sds.brightics.agent.service.TaskService.getTaskResult(TaskService.java:115)
	at com.samsung.sds.brightics.agent.service.TaskService$1.run(TaskService.java:83)
Caused by: java.lang.Throwable: Traceback (most recent call last):
  File "D:\Work\DS\Brightics\brightics-studio\brightics-server\functions\python\brightics\brightics_python_runner.py", line 130, in _executer
    exec(exec_code_object)
  File "<string>", line 6, in <module>
  File "D:\Work\DS\Brightics\brightics-studio\brightics-server\functions\python\brightics\function\statistics\anova.py", line 85, in oneway_anova
    return _oneway_anova(table, **params)
  File "D:\Work\DS\Brightics\brightics-studio\brightics-server\functions\python\brightics\function\statistics\anova.py", line 113, in _oneway_anova
    model = ols("""Q('{response_col}') ~ C(Q('{factor_col}'))""".format(response_col=response_col, factor_col=factor_col), table).fit()  # TODO factor_col = class => error
  File "D:\Work\DS\Brightics\brightics-studio\lib\python\Lib\site-packages\statsmodels\regression\linear_model.py", line 273, in fit
    self.pinv_wexog, singular_values = pinv_extended(self.wexog)
  File "D:\Work\DS\Brightics\brightics-studio\lib\python\Lib\site-packages\statsmodels\tools\tools.py", line 342, in pinv_extended
    u, s, vt = np.linalg.svd(X, 0)
  File "D:\Work\DS\Brightics\brightics-studio\lib\python\Lib\site-packages\numpy\linalg\linalg.py", line 1562, in svd
    u, s, vh = gufunc(a, signature=signature, extobj=extobj)
  File "D:\Work\DS\Brightics\brightics-studio\lib\python\Lib\site-packages\numpy\linalg\linalg.py", line 98, in _raise_linalgerror_svd_nonconvergence
    raise LinAlgError("SVD did not converge")
numpy.linalg.linalg.LinAlgError: SVD did not converge
	... 7 more

Response Columns - sum_item_amt(double)
Factor Column - age_cls(string) 라는 input 으로 One Way ANOVA 검정시 에러가 발생합니다.
ex) sum_item_amt / age_cls - 100000 / 'G1' , 200000 / 'G2'....
같은 input data 로 브라이틱스 내의 Python Script 함수를 이용하여 수행시 정상 결과값이 나옴을 확인하였습니다. 아래는 Python Script 함수 내용입니다.

#
#   NOTE : Enter "Out Table Alias"
#   ex)
inputDataframe = inputs[0]
#       result = inputDataframe
#
import scipy.stats as stats
F_statistic, pVal = stats.f_oneway(inputDataframe[inputDataframe['age_cls']=='G1']['sum_item_amt'],
                                   inputDataframe[inputDataframe['age_cls']=='G2']['sum_item_amt'],
                                   inputDataframe[inputDataframe['age_cls']=='G3']['sum_item_amt'])
result = inputDataframe
result['F_statistic'] = F_statistic
result['pVal'] = pVal

수행 환경은 2020.02 / 04 2개 버젼에서 확인하였습니다.

Windows 10, 버전 2004 에 Python 에서 몇몇 데이터 과학 라이브러리 실행에 문제가 있는 것을 확인했습니다.
현재는 numpy 에 문제가 있는 것을 확인했습니다. Brightics Studio 뿐만 아니라 Anaconda 상에서도 동일한 코드를 실행했을 때 동일한 numpy.linalg.linalg.LinAlgError: SVD did not converge 에러가 발생합니다.

윈도가 업데이트 되면서 자연스레 이슈가 해결되는게 가장 좋은 방안이나, 다른 방법을 찾으면 공유하도록 하겠습니다.

그리고 아래 파이선 코드와 Brightics 함수 내부에서 사용하는 코드는 상이합니다. Brightics Studio에서는 from statsmodels.formula.api import ols 를 사용하고 있습니다.

https://download.lfd.uci.edu/pythonlibs/w3jqiv8s/numpy-1.18.5+mkl-cp36-cp36m-win_amd64.whl 를 받으셔서

cd brightics-studio\lib\python
python.exe get-pip.py 하신후
cd Scripts
pip install numpy-1.18.5+mkl-cp36-cp36m-win_amd64.whl

하시면

PS E:\brightics-studio\lib\python\Scripts> .\pip.exe install .\numpy-1.18.5+mkl-cp36-cp36m-win_amd64.whl
Processing e:\brightics-studio\lib\python\scripts\numpy-1.18.5+mkl-cp36-cp36m-win_amd64.whl
Installing collected packages: numpy
Attempting uninstall: numpy
Found existing installation: numpy 1.15.2
Uninstalling numpy-1.15.2:
Successfully uninstalled numpy-1.15.2

기존 1.15.2 모듈이 지워지고 버그가 없는 모듈이 설치가 됩니다.

이후 정상 동작하는 것을 확인했습니다.

정상동작 확인하였습니다 감사합니다.

numpy+mkl 뿐만 아니라 디펜던시 걸린 다른 라이브러리도 필요하여, 다운로드 링크 남깁니다. 설치 방법은 위와 동일 합니다.
설치하지 않으면 PCA 등 scipy를 사용하는 라이브러리에서 값이 이상하게 나올 수 있습니다.

numpy‑1.18.5+mkl‑cp36‑cp36m‑win_amd64.whl
scipy‑1.5.2‑cp36‑cp36m‑win_amd64.whl
numexpr‑2.7.2‑cp36‑cp36m‑win_amd64.whl
statsmodels‑0.11.1‑cp36‑cp36m‑win_amd64.whl
patsy‑0.5.1‑py2.py3‑none‑any.whl