Hướng dẫn how does python handle nan? - trăn xử lý nan như thế nào?

Bài viết này đã được xuất bản như một phần của & nbsp; Data Science Blogathon & NBSP; & nbsp;   

Giới thiệu

Làm sạch dữ liệu là quá trình tìm và sửa dữ liệu không chính xác/không chính xác có trong bộ dữ liệu. Một quy trình như vậy cần thiết là làm một cái gì đó về các giá trị bị thiếu trong bộ dữ liệu. Trong cuộc sống thực, nhiều bộ dữ liệu sẽ có nhiều giá trị bị thiếu, vì vậy việc xử lý chúng là một bước quan trọng.

Tại sao bạn cần điền vào dữ liệu bị thiếu? Bởi vì hầu hết các mô hình học máy mà bạn muốn sử dụng sẽ cung cấp lỗi nếu bạn chuyển các giá trị NAN vào đó. Cách dễ nhất là chỉ cần lấp đầy chúng bằng 0, nhưng điều này có thể làm giảm đáng kể độ chính xác mô hình của bạn. Because most of the machine learning models that you want to use will provide an error if you pass NaN values into it. The easiest way is to just fill them up with 0, but this can reduce your model accuracy significantly.

Để điền vào các giá trị bị thiếu, có nhiều phương pháp có sẵn. Để chọn phương pháp tốt nhất, bạn cần hiểu loại giá trị bị thiếu và tầm quan trọng của nó, trước khi bạn bắt đầu điền/xóa dữ liệu.

Đầu tiên nhìn vào bộ dữ liệu

Trong bài viết này, tôi sẽ làm việc với bộ dữ liệu Titanic từ Kaggle.

Để tải xuống bộ dữ liệu, hãy sử dụng liên kết sau - https://www.kaggle.com/c/titanic

  • Nhập các thư viện cần thiết mà bạn sẽ sử dụng -
    df.info()
    
    6 và
    df.info()
    
    7.

Mã Python:

Hướng dẫn how does python handle nan? - trăn xử lý nan như thế nào?

Xem rằng các cột chứa nhiều cột như

df.info()
8,
df.info()
9,

RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
0, v.v.contains many columns like
df.info()
8,
df.info()
9,

RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
0, etc.. We won’t be working with all the columns in the dataset, so I am going to be deleting the columns I don’t need.

df.drop("Name",axis=1,inplace=True)
df.drop("Ticket",axis=1,inplace=True)
df.drop("PassengerId",axis=1,inplace=True)
df.drop("Cabin",axis=1,inplace=True)
df.drop("Embarked",axis=1,inplace=True)

Xem rằng cũng có các giá trị phân loại trong tập dữ liệu, đối với điều này, bạn cần sử dụng mã hóa nhãn hoặc một mã hóa nóng.

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])
newdf=df
#splitting the data into x and y
y = df['Survived']
df.drop("Survived",axis=1,inplace=True)

Làm thế nào để biết liệu dữ liệu có các giá trị bị thiếu?

Các giá trị bị thiếu thường được biểu diễn dưới dạng


RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
1 hoặc

RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
2 hoặc

RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
3 trong bộ dữ liệu.


RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
4 Hàm có thể được sử dụng để cung cấp thông tin về bộ dữ liệu. Điều này sẽ cung cấp cho bạn các tên cột cùng với số lượng giá trị không phải là null trong mỗi cột.

df.info()

RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB

Xem rằng có các giá trị null trong cột


RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
0.

Cách thứ hai để tìm kiếm liệu chúng ta có giá trị null trong dữ liệu là bằng cách sử dụng hàm


RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
6 hay không.

print(df.isnull().sum())
Pclass      0
Sex         0
Age       177
SibSp       0
Parch       0
Fare        0
dtype: int64

Xem tất cả các giá trị null trong tập dữ liệu nằm trong cột -


RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
0.

Hãy cùng thử lắp dữ liệu bằng hồi quy logistic.

from sklearn.model_selection import train_test_split
X_train, X_test,y_train,y_test = train_test_split(df,y,test_size=0.3)
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(X_train,y_train)
---------------------------------------------------------------------------


ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

Xem rằng mô hình hồi quy logistic không hoạt động vì chúng ta có các giá trị NAN trong tập dữ liệu. Chỉ một số thuật toán học máy có thể hoạt động với các dữ liệu bị thiếu như KNN, sẽ bỏ qua các giá trị với các giá trị NAN.

Bây giờ, hãy để Lôi nhìn vào các phương pháp khác nhau mà bạn có thể sử dụng để đối phó với dữ liệu bị thiếu.

Các phương pháp tôi sẽ thảo luận là

  1. Xóa các cột có dữ liệu bị thiếu
  2. Xóa các hàng có dữ liệu bị thiếu
  3. Điền vào dữ liệu bị thiếu bằng một giá trị - cắt bỏ
  4. Cắt bỏ với một cột bổ sung
  5. Đổ đầy mô hình hồi quy

1. Xóa cột với dữ liệu bị thiếu

Hướng dẫn how does python handle nan? - trăn xử lý nan như thế nào?

Trong trường hợp này, hãy để xóa cột,


RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
0 và sau đó phù hợp với mô hình và kiểm tra độ chính xác.

Nhưng đây là một trường hợp cực đoan và chỉ nên được sử dụng khi có nhiều giá trị null trong cột.

updated_df = df.dropna(axis=1)
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])
newdf=df
0
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])
newdf=df
1
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])
newdf=df
2
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])
newdf=df
3

Xem rằng chúng tôi có thể đạt được độ chính xác 79,4%.

Vấn đề với phương pháp này là chúng ta có thể mất thông tin có giá trị về tính năng đó, vì chúng ta đã xóa nó hoàn toàn do một số giá trị null.

Chỉ nên được sử dụng nếu có quá nhiều giá trị null.

2. Xóa hàng với dữ liệu bị thiếu

Nếu có một hàng nhất định với dữ liệu bị thiếu, thì bạn có thể xóa toàn bộ hàng với tất cả các tính năng trong hàng đó.


RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
9 được sử dụng để thả cột với các giá trị `nan`.

print(df.isnull().sum())
0 được sử dụng để thả hàng với các giá trị `nan`.

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])
newdf=df
4
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])
newdf=df
5
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])
newdf=df
0
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])
newdf=df
7
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])
newdf=df
8
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])
newdf=df
9

Trong trường hợp này, hãy xem rằng chúng tôi có thể đạt được độ chính xác tốt hơn trước. Điều này có thể là do cột


RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
0 chứa nhiều thông tin có giá trị hơn chúng ta mong đợi.

3. Đổ đầy các giá trị bị thiếu - Cắt bỏ

Trong trường hợp này, chúng tôi sẽ điền vào các giá trị bị thiếu bằng một số nhất định.

Những cách có thể để làm điều này là:

  1. Điền vào dữ liệu bị thiếu bằng giá trị trung bình hoặc trung bình nếu nó là một biến số.
  2. Đổ đầy dữ liệu bị thiếu với chế độ nếu nó có giá trị phân loại.
  3. Điền vào giá trị số bằng 0 hoặc -999 hoặc một số số khác sẽ không xảy ra trong dữ liệu. Điều này có thể được thực hiện để máy có thể nhận ra rằng dữ liệu không có thật hoặc khác nhau.
  4. Đổ đầy giá trị phân loại bằng một loại mới cho các giá trị bị thiếu.

Bạn có thể sử dụng hàm

print(df.isnull().sum())
2 để điền vào các giá trị null trong tập dữ liệu.

#splitting the data into x and y
y = df['Survived']
df.drop("Survived",axis=1,inplace=True)
0
#splitting the data into x and y
y = df['Survived']
df.drop("Survived",axis=1,inplace=True)
1
#splitting the data into x and y
y = df['Survived']
df.drop("Survived",axis=1,inplace=True)
2
#splitting the data into x and y
y = df['Survived']
df.drop("Survived",axis=1,inplace=True)
3

Giá trị độ chính xác được đưa ra là 77,98%, đó là giảm so với trường hợp trước đó.

Điều này sẽ không xảy ra nói chung, trong trường hợp này, điều đó có nghĩa là giá trị trung bình đã không lấp đầy giá trị


RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
2 đúng cách.

4. Cắt bỏ với một cột bổ sung

Sử dụng hàm

print(df.isnull().sum())
4 từ mô -đun
print(df.isnull().sum())
5 để áp đặt các giá trị.

Vượt qua

print(df.isnull().sum())
6 như một đối số cho hàm. Nó có thể là trung bình hoặc chế độ hoặc trung bình.

Vấn đề với mô hình trước đó là mô hình không biết liệu các giá trị đến từ dữ liệu gốc hay giá trị bị lỗi. Để đảm bảo mô hình biết điều này, chúng tôi sẽ thêm

print(df.isnull().sum())
7 cột sẽ có giá trị
print(df.isnull().sum())
8 làm giá trị, nếu đó là giá trị null và
print(df.isnull().sum())
9 nếu nó không phải là giá trị null.

#splitting the data into x and y
y = df['Survived']
df.drop("Survived",axis=1,inplace=True)
4
#splitting the data into x and y
y = df['Survived']
df.drop("Survived",axis=1,inplace=True)
5
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Sex'] = le.fit_transform(df['Sex'])
newdf=df
8
#splitting the data into x and y
y = df['Survived']
df.drop("Survived",axis=1,inplace=True)
7

5. Đổ đầy mô hình hồi quy

Trong trường hợp này, các giá trị null trong một cột được điền bằng cách lắp mô hình hồi quy bằng các cột khác trong bộ dữ liệu.

Tức là trong trường hợp này, mô hình hồi quy sẽ chứa tất cả các cột ngoại trừ


RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
0 trong X và

RangeIndex: 891 entries, 0 to 890
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Pclass  891 non-null    int64  
 1   Sex     891 non-null    int64  
 2   Age     714 non-null    float64
 3   SibSp   891 non-null    int64  
 4   Parch   891 non-null    int64  
 5   Fare    891 non-null    float64
dtypes: float64(2), int64(4)
memory usage: 41.9 KB
0 trong Y.

Sau đó, sau khi điền các giá trị trong cột tuổi, sau đó chúng ta sẽ sử dụng hồi quy logistic để tính độ chính xác.

#splitting the data into x and y
y = df['Survived']
df.drop("Survived",axis=1,inplace=True)
8

#splitting the data into x and y
y = df['Survived']
df.drop("Survived",axis=1,inplace=True)
9
df.info()
0
df.info()
1
df.info()
2
df.info()
3
df.info()
4
df.info()
5

Xem rằng mô hình này tạo ra độ chính xác cao hơn mô hình trước đây vì chúng tôi đang sử dụng một mô hình hồi quy cụ thể để lấp đầy các giá trị bị thiếu.

Chúng tôi cũng có thể sử dụng các mô hình & nbsp;

Pclass      0
Sex         0
Age       177
SibSp       0
Parch       0
Fare        0
dtype: int64
2 để điền vào các giá trị bị thiếu. Nhưng đôi khi, sử dụng các mô hình để cắt bỏ có thể dẫn đến việc quá mức dữ liệu.

Việc đưa ra các giá trị bị thiếu bằng mô hình hồi quy cho phép chúng tôi cải thiện mô hình của mình so với việc bỏ các cột đó.

Nhưng bạn phải hiểu rằng

Pclass      0
Sex         0
Age       177
SibSp       0
Parch       0
Fare        0
dtype: int64
3.

Mỗi phương pháp mà tôi đã thảo luận trong blog này, có thể hoạt động tốt với các loại bộ dữ liệu khác nhau. Bạn phải thử nghiệm thông qua các phương pháp khác nhau, để kiểm tra phương thức nào hoạt động tốt nhất cho bộ dữ liệu của bạn.

Cảm ơn bạn đã đọc qua bài viết. Hy vọng bây giờ bạn có một sự hiểu biết rõ ràng về cách đối phó với các giá trị bị thiếu trong bộ dữ liệu của bạn.

Các phương tiện truyền thông được hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định của tác giả. & NBSP;

Làm thế nào để Python xử lý các giá trị NAN?

Nếu có một hàng nhất định với dữ liệu bị thiếu, thì bạn có thể xóa toàn bộ hàng với tất cả các tính năng trong hàng đó.Trục = 1 được sử dụng để thả cột với giá trị `nan`.axis = 0 được sử dụng để thả hàng với các giá trị` nan`.axis=1 is used to drop the column with `NaN` values. axis=0 is used to drop the row with `NaN` values.

Python có hỗ trợ Nan không?

Trong Python, loại phao có NAN.NAN là viết tắt của "không phải là một số" và được xác định bởi tiêu chuẩn nổi của IEEE 754. . nan stands for "not a number" and is defined by the IEEE 754 floating-point standard.

Làm thế nào để Python bỏ qua các giá trị NAN?

Bây giờ chúng ta hãy nhìn vào 5 cách dễ dàng và hiệu quả trong Python về việc loại bỏ các giá trị NAN khỏi danh sách ...
Sử dụng hàm isnan () của Numpy ..
Bằng cách sử dụng hàm isnan () của Math ..
Sử dụng chức năng pandas isnull () ..
Sử dụng cho vòng lặp ..
Với danh sách hiểu ..

Làm thế nào để gấu trúc xử lý giá trị nan?

Gấu trúc không đối xử với không và NAN về cơ bản có thể hoán đổi cho nhau để chỉ ra các giá trị thiếu hoặc null ...
isnull().
notnull().
dropna().
fillna().
replace().
interpolate().