해결된 질문
작성
·
185
0
bostonDF = pd.DataFrame(boston.data , columns = boston.feature_names)
boston data를 DataFrame화 할 때 변수로 boston.data, columns=boston.feature_names 같은 경우
선생님께서 전부 암기하시고 치시는건지 궁금합니다.
그리고 머신러닝을 공부하다보면 암기를 어느선까지 해야되는지 애매해서 질문드립니다.
def reduce_mem_usage(df, verbose=True):
numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
start_mem = df.memory_usage().sum() / 1024**2
for col in df.columns:
col_type = df[col].dtypes
if col_type in numerics:
c_min = df[col].min()
c_max = df[col].max()
if str(col_type)[:3] == 'int':
if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
df[col] = df[col].astype(np.int8)
elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
df[col] = df[col].astype(np.int16)
elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
df[col] = df[col].astype(np.int32)
elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
df[col] = df[col].astype(np.int64)
else:
c_prec = df[col].apply(lambda x: np.finfo(x).precision).max()
if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max and c_prec == np.finfo(np.float16).precision:
df[col] = df[col].astype(np.float16)
elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max and c_prec == np.finfo(np.float32).precision:
df[col] = df[col].astype(np.float32)
else:
df[col] = df[col].astype(np.float64)
end_mem = df.memory_usage().sum() / 1024**2
if verbose: print('Mem. usage decreased to {:5.2f} Mb ({:.1f}% reduction)'.format(end_mem, 100 * (start_mem - end_mem) / start_mem))
return df
위와 같은 코드는 암기하지 않고 복붙하여 사용하지만, 어떤건 암기하고 어떤건 같다 쓰는지 그 기준이 애매모호해서
이와 관련하여 질문드립니다. 조언해주시면 큰 도움 될거 같습니다. 감사합니다.
답변 2
0
0
안녕하십니까,
일단 저는 암기력이 약해서 모든걸 외울 수 없습니다. 대강 이 프로그램에 전에 제가 작성한 프로그램이나 라이브러리와 상당히 유사성이 있고, 어떤 라이브러리를 가져다 쓰면 편리하게 작성할 수 있구나 정도를 암기하는 수준입니다.
그리고 암기를 어느선까지 해야 되는 지는 각각 개인 스타일이 있을 것이니, 먼저 제 개인 스타일로 국한하여 말씀드리겠습니다.
저의 경우는무작정 따라하거나 암기할 것인가, 아예 무시하고 복붙하는 경우의 기준은
1. 이루려는 학습 방향성에 얼마나 근접 한것인지.
가령 위의 reduce_mem_usage()와 같은 코드는 pandas나 numpy의 메모리 사용에 대해서 매우 고민한 결과 이를 해결한 코드 입니다. 머신러닝을 익히기 위한 학습 방향성과는 맞지 않습니다.대강의 의미만 파악하고 쓸만한 유틸리티를 구했다는 정도에서 만족하고 붙여다 사용할 것입니다.
2. 오랜 시간을 들여서 익힐 가치가 있는 것인가?
이게 좀 애매합니다. 사실 이 기준에 집착하다보면 전부 다 복붙하게 됩니다. 어려운 문제를 자꾸 접하면서 문제 해결 능력을 늘려가야 하는데, 좋은 핑계거리를 만들게 되는 결과로 이어질 수 있습니다. 이러한 내재적인 약점을 인지하고, 다시 한번 이 기준을 생각해봐도 여전히 오랜 시간을 들일 필요가 없는 코드라고 생각되면 복붙합니다.
3. 구현 능력을 높일 수 있는 코드인가?
캐글등의 사이트를 검색하다 보면 '좋은 코드다' 라고 느낄 만한 여러 코드들을 발견하게 됩니다. 이런 경우에는 코드가 어려워도 무조건 도전해 보는게 좋습니다. 위의 reduce_mem_usage()는 유틸리티성 코드 입니다. 만일 이런 부분이 캐글의 전체 코드에 포함되었다면 과감히 이부분을 제외하고 좀 더 문제해결에 접근한 코드를 암기또는 연습하는게 좋습니다. 예를 들어 feature engineering, Model 수립등의 코드들을 무조건 따라해 보는게 좋습니다.
다 개인 스타일이 다르기 때문에 정답은 없다고 생각합니다. 저도 머신러닝 코드 중에서 시각화 코드에 어려움을 느껴서 많은 시간을 투입해서 공부했지만, 돌이켜보면 그럴 필요가 없었다고 생각 됩니다(아이러니 하게도 많은 시간을 투입해서 공부하지 않았다면 이런 생각 자체를 하지 못했을 수도 있습니다)
좋은 코드를 만나면 일단 무작정 따라하는 것이 좋습니다. 그 과정에서 암기하는 것도 좋은 방법입니다. 다만 유틸리티성에 가까운 것이라면 굳이 손대지 마시고 복붙하십시요. 계속적으로 좋은 코드를 따라하다 보면 효율적으로 어떻게 학습해야 할지 스스로 결정할 수 있는 기준이 더 확실하게 만들어 집니다. 그런 느낌이 들때까지 지속적으로 학습하시다 보면 좋은 결과로 이어 질 것입니다.
감사합니다.