굉장히 고민이 되는 주제입니다.
https://stats.stackexchange.com/questions/258610/machine-learning-dealing-with-nan-values
위 답변의 결론은 NaN 값이 생성 하게 되는 방법을 (해당 항목이 왜 NaN이 된것인지)이해하고 각 기능의 예상되는 동작이 무엇인지 가정해서 진행해야 합니다. 어떤때는 0으로 치환되기도 하지만 어떤 경우에는 다른값 의미가 되어야 합니다. 그것은 해당 항목에 따라 면밀히 살펴보고 진행하여야 합니다.
어떤 값으로 변경해야 할지 모르기 때문에 다른 값으로 변경하는 예제를 만들어 두었습니다.
1. NaN 값을 -999 값으로 변경하기 pytorch tensor
import pandas as pd dataset = pd.read_csv("train.tsv", delimiter='\t', header=0) print(dataset.info(verbose=True)) import torch one_hot_encoded = pd.get_dummies(dataset) torch_tensor = torch.from_numpy(one_hot_encoded.values) print(torch_tensor) torch_tensor[torch_tensor != torch_tensor] = -999 print(torch_tensor)
NaN텐서의 값을 변경하는 코드
torch_tensor[torch_tensor != torch_tensor] = -999
입력 데이터
0 1 지역 3 4 NaN 0.3160718715457761 광주 0.618074061962662 부산 0.4779143261004096 0.7640950473377978 인천 0.7554662967547567 인천 0.46356805076582885 0.5837447431729355 대전 0.793675978965779 광주 0.5695109222857196 0.05089301078346342 인천 0.9556152127770076 부산 0.04493729261707624 0.14316706161067427 경기 0.3853064558624778 울산 0.4211392967613088 0.4223696769241083 울산 0.5668579921124862 광주 0.6968309725237914 0.9771633054896907 서울 0.8357267917293922 경기 0.11353740126056755 0.7601654905557846 대전 0.743158407293178 부산 0.22370034270270966 0.3115915771469119 대전 0.11848968372403645 부산 0.137646137601257 0.600286886461799 광주 0.7007352606121582 강원 0.031428666050948184 0.39108944068098905 대전 0.8733145643417124 강원 0.9964849451141898 0.1515641318053479 인천 0.5335673749065628 인천 0.22542471556473298 0.8561772376533481 서울 0.9362096685200896 울산 0.4686621433360696 0.17537990374522128 대구 0.3499523151304561 울산 0.046060811241397714 0.8299155100569963 경기 0.21535901604117658 경기 0.1899909553960777 0.21936448957471155 인천 0.6575452140509177 경기 0.41758513381425333 0.42277109702047366 서울 0.8529515809615816 부산 0.3197992908993763 NaN 강원 0.4037015504523124 대구 0.0562629654450455 0.551939153390536 인천 0.9260164254116474 세종 0.587953265713976 0.6413981811587487 대구 0.023584307830762707 대전
결과
<class 'pandas.core.frame.DataFrame'> RangeIndex: 20 entries, 0 to 19 Data columns (total 5 columns): 0 19 non-null float64 1 19 non-null float64 지역 20 non-null object 3 20 non-null float64 4 20 non-null object dtypes: float64(3), object(2) memory usage: 880.0+ bytes None tensor([[ nan, 0.3161, 0.6181, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000], [ 0.4779, 0.7641, 0.7555, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000], [ 0.4636, 0.5837, 0.7937, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.5695, 0.0509, 0.9556, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000], [ 0.0449, 0.1432, 0.3853, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000], [ 0.4211, 0.4224, 0.5669, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.6968, 0.9772, 0.8357, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.1135, 0.7602, 0.7432, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000], [ 0.2237, 0.3116, 0.1185, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000], [ 0.1376, 0.6003, 0.7007, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.0314, 0.3911, 0.8733, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.9965, 0.1516, 0.5336, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000], [ 0.2254, 0.8562, 0.9362, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000], [ 0.4687, 0.1754, 0.3500, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000], [ 0.0461, 0.8299, 0.2154, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.1900, 0.2194, 0.6575, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.4176, 0.4228, 0.8530, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000], [ 0.3198, nan, 0.4037, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.0563, 0.5519, 0.9260, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000], [ 0.5880, 0.6414, 0.0236, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000]], dtype=torch.float64) tensor([[-999.0000, 0.3161, 0.6181, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000], [ 0.4779, 0.7641, 0.7555, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000], [ 0.4636, 0.5837, 0.7937, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.5695, 0.0509, 0.9556, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000], [ 0.0449, 0.1432, 0.3853, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000], [ 0.4211, 0.4224, 0.5669, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.6968, 0.9772, 0.8357, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.1135, 0.7602, 0.7432, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000], [ 0.2237, 0.3116, 0.1185, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000], [ 0.1376, 0.6003, 0.7007, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.0314, 0.3911, 0.8733, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.9965, 0.1516, 0.5336, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000], [ 0.2254, 0.8562, 0.9362, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000], [ 0.4687, 0.1754, 0.3500, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000], [ 0.0461, 0.8299, 0.2154, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.1900, 0.2194, 0.6575, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.4176, 0.4228, 0.8530, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000], [ 0.3198, -999.0000, 0.4037, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000], [ 0.0563, 0.5519, 0.9260, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000], [ 0.5880, 0.6414, 0.0236, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000, 0.0000, 0.0000, 0.0000, 0.0000]], dtype=torch.float64)
참고로 NaN 인식하는 스트링 값은 nan,NaN,NA 3가지 이며 text에 해당 string이 있을때 숫자로 인식(numpy.nan)하게 됩니다.
2. pandas fillna 이용
3. 범주형 데이터 NaN 처리 방법
범주형이란 선택 사항이 유한한 집합에 속한 하나 이상의 이산 항목을 표현하는 입력 특성을 가리킵니다, 범주형 데이터에는 논리적 순서가 없을 수도 있습니다. 예를 들면, 범주형에는 성별, 지역, 결제 방법이 있습니다. 서울=1, 광주=2, 인천=3 으로 표현되더라도 해당 항목은 범주형에 해당됩니다. 인천(3)-광주(2)=서울(1)의 의미를 지니지 않기 때문입니다. 그러면 이러한 범주형 데이터는 Machine Learning에서 어떻게 해야할까요?아래 좋은 자료가 있습니다.
https://blog.myyellowroad.com/using-categorical-data-in-machine-learning-with-python-from-dummy-variables-to-deep-category-66041f734512
https://blog.myyellowroad.com/using-categorical-data-in-machine-learning-with-python-from-dummy-variables-to-deep-category-42fd0a43b009
카테고리 데이터가 많지 않다면 one hot encoding 을 사용하는 방법입니다. 즉 인천에 차원 하나를 할당하고 서울에도 차원 하나를 할당 하는 방식입니다. pandas에 get_dummies 함수를 이용하면 쉽게 변환이 가능합니다.
입력 데이터
0 1 지역 3 4 NaN 0.3160718715457761 광주 0.618074061962662 부산 0.4779143261004096 0.7640950473377978 인천 0.7554662967547567 인천 0.46356805076582885 0.5837447431729355 대전 0.793675978965779 광주 0.5695109222857196 0.05089301078346342 인천 0.9556152127770076 부산 0.04493729261707624 0.14316706161067427 경기 0.3853064558624778 울산 0.4211392967613088 0.4223696769241083 울산 0.5668579921124862 광주 0.6968309725237914 0.9771633054896907 서울 0.8357267917293922 경기 0.11353740126056755 0.7601654905557846 대전 0.743158407293178 부산 0.22370034270270966 0.3115915771469119 대전 0.11848968372403645 부산 0.137646137601257 0.600286886461799 광주 0.7007352606121582 강원 0.031428666050948184 0.39108944068098905 대전 0.8733145643417124 강원 0.9964849451141898 0.1515641318053479 인천 0.5335673749065628 인천 0.22542471556473298 0.8561772376533481 서울 0.9362096685200896 울산 0.4686621433360696 0.17537990374522128 대구 0.3499523151304561 울산 0.046060811241397714 0.8299155100569963 경기 0.21535901604117658 경기 0.1899909553960777 0.21936448957471155 인천 0.6575452140509177 NaN 0.41758513381425333 0.42277109702047366 서울 0.8529515809615816 부산 0.3197992908993763 NaN 강원 0.4037015504523124 대구 0.0562629654450455 0.551939153390536 인천 0.9260164254116474 세종 0.587953265713976 0.6413981811587487 대구 0.023584307830762707 대전
코드에 dummy_na=True 옵션을 넣으면 다음 코드에 의해서 pd.get_dummies(dataset,dummy_na=True), 4_nan와 같이 마지막 항목에 nan 처리를 위한 차원이 늘어나게 됩니다.
import pandas as pd dataset = pd.read_csv("train.tsv", delimiter='\t', header=0) print(dataset.info(verbose=True)) print(dataset) import torch one_hot_encoded = pd.get_dummies(dataset,dummy_na=True) print(one_hot_encoded) print(one_hot_encoded.info(verbose=True))
결과
<class 'pandas.core.frame.DataFrame'> RangeIndex: 20 entries, 0 to 19 Data columns (total 5 columns): 0 19 non-null float64 1 19 non-null float64 지역 20 non-null object 3 20 non-null float64 4 19 non-null object dtypes: float64(3), object(2) memory usage: 880.0+ bytes None 0 1 지역 3 4 0 NaN 0.316072 광주 0.618074 부산 1 0.477914 0.764095 인천 0.755466 인천 2 0.463568 0.583745 대전 0.793676 광주 3 0.569511 0.050893 인천 0.955615 부산 4 0.044937 0.143167 경기 0.385306 울산 5 0.421139 0.422370 울산 0.566858 광주 6 0.696831 0.977163 서울 0.835727 경기 7 0.113537 0.760165 대전 0.743158 부산 8 0.223700 0.311592 대전 0.118490 부산 9 0.137646 0.600287 광주 0.700735 강원 10 0.031429 0.391089 대전 0.873315 강원 11 0.996485 0.151564 인천 0.533567 인천 12 0.225425 0.856177 서울 0.936210 울산 13 0.468662 0.175380 대구 0.349952 울산 14 0.046061 0.829916 경기 0.215359 경기 15 0.189991 0.219364 인천 0.657545 NaN 16 0.417585 0.422771 서울 0.852952 부산 17 0.319799 NaN 강원 0.403702 대구 18 0.056263 0.551939 인천 0.926016 세종 19 0.587953 0.641398 대구 0.023584 대전 0 1 3 지역_강원 지역_경기 지역_광주 지역_대구 지역_대전 지역_서울 지역_울산 ... 4_강원 4_경기 4_광주 4_대구 4_대전 4_부산 4_세종 4_울산 4_인천 4_nan 0 NaN 0.316072 0.618074 0 0 1 0 0 0 0 ... 0 0 0 0 0 1 0 0 0 0 1 0.477914 0.764095 0.755466 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 1 0 2 0.463568 0.583745 0.793676 0 0 0 0 1 0 0 ... 0 0 1 0 0 0 0 0 0 0 3 0.569511 0.050893 0.955615 0 0 0 0 0 0 0 ... 0 0 0 0 0 1 0 0 0 0 4 0.044937 0.143167 0.385306 0 1 0 0 0 0 0 ... 0 0 0 0 0 0 0 1 0 0 5 0.421139 0.422370 0.566858 0 0 0 0 0 0 1 ... 0 0 1 0 0 0 0 0 0 0 6 0.696831 0.977163 0.835727 0 0 0 0 0 1 0 ... 0 1 0 0 0 0 0 0 0 0 7 0.113537 0.760165 0.743158 0 0 0 0 1 0 0 ... 0 0 0 0 0 1 0 0 0 0 8 0.223700 0.311592 0.118490 0 0 0 0 1 0 0 ... 0 0 0 0 0 1 0 0 0 0 9 0.137646 0.600287 0.700735 0 0 1 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 0 10 0.031429 0.391089 0.873315 0 0 0 0 1 0 0 ... 1 0 0 0 0 0 0 0 0 0 11 0.996485 0.151564 0.533567 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 1 0 12 0.225425 0.856177 0.936210 0 0 0 0 0 1 0 ... 0 0 0 0 0 0 0 1 0 0 13 0.468662 0.175380 0.349952 0 0 0 1 0 0 0 ... 0 0 0 0 0 0 0 1 0 0 14 0.046061 0.829916 0.215359 0 1 0 0 0 0 0 ... 0 1 0 0 0 0 0 0 0 0 15 0.189991 0.219364 0.657545 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 1 16 0.417585 0.422771 0.852952 0 0 0 0 0 1 0 ... 0 0 0 0 0 1 0 0 0 0 17 0.319799 NaN 0.403702 1 0 0 0 0 0 0 ... 0 0 0 1 0 0 0 0 0 0 18 0.056263 0.551939 0.926016 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 1 0 0 0 19 0.587953 0.641398 0.023584 0 0 0 1 0 0 0 ... 0 0 0 0 1 0 0 0 0 0 [20 rows x 22 columns] <class 'pandas.core.frame.DataFrame'> RangeIndex: 20 entries, 0 to 19 Data columns (total 22 columns): 0 19 non-null float64 1 19 non-null float64 3 20 non-null float64 지역_강원 20 non-null uint8 지역_경기 20 non-null uint8 지역_광주 20 non-null uint8 지역_대구 20 non-null uint8 지역_대전 20 non-null uint8 지역_서울 20 non-null uint8 지역_울산 20 non-null uint8 지역_인천 20 non-null uint8 지역_nan 20 non-null uint8 4_강원 20 non-null uint8 4_경기 20 non-null uint8 4_광주 20 non-null uint8 4_대구 20 non-null uint8 4_대전 20 non-null uint8 4_부산 20 non-null uint8 4_세종 20 non-null uint8 4_울산 20 non-null uint8 4_인천 20 non-null uint8 4_nan 20 non-null uint8 dtypes: float64(3), uint8(19) memory usage: 940.0 bytes None
댓글 없음:
댓글 쓰기