다음 유명한 데이터 과학 인용문을 들어보셨을 것입니다.
데이터 과학 프로젝트에서 80%의 시간은 데이터 처리에 사용됩니다.
들어본 적이 없다면 기억하세요. 데이터 정리는 데이터 과학 워크플로의 기초입니다. 기계 학습 모델은 제공된 데이터를 기반으로 수행됩니다. 지저분한 데이터는 성능이 저하되거나 잘못된 결과로 이어질 수 있지만, 깨끗한 데이터는 좋은 모델 성능을 위한 전제 조건입니다. 물론 깨끗한 데이터가 항상 좋은 성능을 의미하는 것은 아닙니다. 올바른 모델 선택(나머지 20%)도 중요하지만, 깨끗한 데이터가 없으면 가장 강력한 모델이라도 기대한 수준을 달성할 수 없습니다.
이 기사에서는 데이터 정리에서 해결해야 할 문제를 나열하고 가능한 해결 방법을 보여줍니다. 이 기사를 통해 단계별로 데이터 정리를 수행하는 방법을 배울 수 있습니다.
데이터 세트에 누락된 데이터가 포함된 경우 채우기 전에 일부 데이터 분석을 수행할 수 있습니다. 빈 셀의 위치 자체가 유용한 정보를 알려줄 수 있기 때문입니다. 예:
missingno 이 Python 라이브러리를 사용하면 위의 상황을 확인할 수 있으며 사용이 매우 간단합니다. 예를 들어 아래 그림의 흰색 선은 NA입니다.
import missingno as msno msno.matrix(df)
채우는 방법은 다양합니다. 누락된 값(예:
다양한 방법에는 서로 장단점이 있으며, 전체적으로 작동하는 "최고의" 기술은 없습니다. 상황. 자세한 내용은 이전 기사를 참조하세요.
Outliers는 데이터 세트의 다른 지점에 비해 매우 크거나 매우 작은 값입니다. 이들의 존재는 수학적 모델의 성능에 큰 영향을 미칩니다. 다음 간단한 예를 살펴보겠습니다.
왼쪽 이미지에는 이상치가 없으며 선형 모델이 데이터 포인트에 매우 잘 맞습니다. 오른쪽 이미지에는 이상치가 있습니다. 모델이 데이터 세트의 모든 점을 포함하려고 할 때 이 이상치가 있으면 모델이 적합하는 방식이 바뀌고 모델이 최소 절반 이상의 점에 적합하지 않게 됩니다.
아웃라이어의 경우 이상치를 판단하는 방법을 소개해야 합니다. 이를 위해서는 수학적 관점에서 최대값과 최소값이 무엇인지 명확히 해야 합니다.
Q3+1.5 x IQR보다 크거나 Q1-1.5 x IQR보다 작은 값은 이상치로 간주될 수 있습니다. IQR(사분위간 범위)은 Q3과 Q1의 차이입니다(IQR = Q3-Q1).
다음 함수를 사용하여 데이터 세트의 이상값 수를 확인할 수 있습니다.
def number_of_outliers(df): df = df.select_dtypes(exclude = 'object') Q1 = df.quantile(0.25) Q3 = df.quantile(0.75) IQR = Q3 - Q1 return ((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).sum()
이상값을 처리하는 한 가지 방법은 이상값을 Q3 또는 Q1과 동일하게 만드는 것입니다. 아래 lower_upper_range 함수는 pandas 및 numpy 라이브러리를 사용하여 외부에 이상값이 있는 범위를 찾은 다음, Clip 함수를 사용하여 값을 지정된 범위로 자릅니다.
def lower_upper_range(datacolumn): sorted(datacolumn) Q1,Q3 = np.percentile(datacolumn , [25,75]) IQR = Q3 - Q1 lower_range = Q1 - (1.5 * IQR) upper_range = Q3 + (1.5 * IQR) return lower_range,upper_range for col in columns: lowerbound,upperbound = lower_upper_range(df[col]) df[col]=np.clip(df[col],a_min=lowerbound,a_max=upperbound)
이상치 문제는 숫자 특성에 관한 것이었습니다. 이제 문자 유형(범주형) 특성을 살펴보겠습니다. 데이터가 일치하지 않는다는 것은 고유한 열 클래스의 표현이 서로 다르다는 것을 의미합니다. 예를 들어 성별 열에는 남/여와 남/여가 모두 있습니다. 이 경우에는 4개의 클래스가 있지만 실제로는 2개의 클래스가 있습니다.
현재 이 문제에 대한 자동 해결 방법이 없으므로 수동 분석이 필요합니다. 이러한 분석을 위해 pandas의 고유한 기능이 준비되어 있습니다. 자동차 브랜드의 예를 살펴보겠습니다.
df['CarName'] = df['CarName'].str.split().str[0] print(df['CarName'].unique())
maxda-mazda, Nissan-nissan, porcshce-porsche, toyouta-toyota 등이 모두 병합될 수 있습니다.
df.loc[df['CarName'] == 'maxda', 'CarName'] = 'mazda' df.loc[df['CarName'] == 'Nissan', 'CarName'] = 'nissan' df.loc[df['CarName'] == 'porcshce', 'CarName'] = 'porsche' df.loc[df['CarName'] == 'toyouta', 'CarName'] = 'toyota' df.loc[df['CarName'] == 'vokswagen', 'CarName'] = 'volkswagen' df.loc[df['CarName'] == 'vw', 'CarName'] = 'volkswagen'
잘못된 데이터는 논리적으로 전혀 올바르지 않은 값을 나타냅니다. 예를 들어,
숫자 열의 경우 pandas의 설명 기능을 사용하여 이를 식별할 수 있습니다. 오류:
df.describe()
데이터가 잘못된 이유는 두 가지일 수 있습니다.
1. 데이터 수집 오류: 예를 들어 입력 시 범위를 판단하지 않고 키 입력 시 179cm 대신 1799cm가 입력되지만 프로그램에서는 데이터의 범위를 판단하지 않습니다.
2. 데이터 연산 오류
数据集的某些列可能通过了一些函数的处理。 例如,一个函数根据生日计算年龄,但是这个函数出现了BUG导致输出不正确。
以上两种随机错误都可以被视为空值并与其他 NA 一起估算。
当数据集中有相同的行时就会产生重复数据问题。 这可能是由于数据组合错误(来自多个来源的同一行),或者重复的操作(用户可能会提交他或她的答案两次)等引起的。 处理该问题的理想方法是删除复制行。
可以使用 pandas duplicated 函数查看重复的数据:
df.loc[df.duplicated()]
在识别出重复的数据后可以使用pandas 的 drop_duplicate 函数将其删除:
df.drop_duplicates()
在构建模型之前,数据集被分成训练集和测试集。 测试集是看不见的数据用于评估模型性能。 如果在数据清洗或数据预处理步骤中模型以某种方式“看到”了测试集,这个就被称做数据泄漏(data leakage)。 所以应该在清洗和预处理步骤之前拆分数据:
以选择缺失值插补为例。数值列中有 NA,采用均值法估算。在 split 前完成时,使用整个数据集的均值,但如果在 split 后完成,则使用分别训练和测试的均值。
第一种情况的问题是,测试集中的推算值将与训练集相关,因为平均值是整个数据集的。所以当模型用训练集构建时,它也会“看到”测试集。但是我们拆分的目标是保持测试集完全独立,并像使用新数据一样使用它来进行性能评估。所以在操作之前必须拆分数据集。
虽然训练集和测试集分别处理效率不高(因为相同的操作需要进行2次),但它可能是正确的。因为数据泄露问题非常重要,为了解决代码重复编写的问题,可以使用sklearn 库的pipeline。简单地说,pipeline就是将数据作为输入发送到的所有操作步骤的组合,这样我们只要设定好操作,无论是训练集还是测试集,都可以使用相同的步骤进行处理,减少的代码开发的同时还可以减少出错的概率。
위 내용은 Python을 사용한 데이터 정리에 대한 전체 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!