我有一个数据集。它有一些字符串列。我想转换这些字符串列。我正在使用这个数据集开发一个神经网络。但是由于数据集有一些字符串值,我无法训练我的神经网络。将这些字符串值转换为神经网络可读格式的最佳方法是什么?
这是我拥有的数据集
type,amount,nameOrig,oldbalanceOrg,newbalanceOrig,nameDest,oldbalanceDest,newbalanceDest,isFraud,isFlaggedFraud
PAYMENT,9839.64,C1231006815,170136.0,160296.36,M1979787155,0.0,0.0,1,0
PAYMENT,1864.28,C1666544295,21249.0,19384.72,M2044282225,0.0,0.0,0,0
TRANSFER,181.0,C1305486145,181.0,0.0,C553264065,0.0,0.0,0,1
我想将这些类型,名称Orig,nameDest字段转换为神经网络可读格式。
我使用了以下方法。但我不知道这是对还是错。
import pandas as pd
from sklearn.preprocessing import LabelEncoder
enc = LabelEncoder()
test_set = pd.read_csv('cs.csv')
new_test_set['type'] = enc.fit(new_test_set['type'])
我经历了以下问题。但他们中的大多数都不适合我
如何将基于字符串的数据框转换为数字
使用熊猫库将非数字转换为数值
使用熊猫库将非数字转换为数值
在这种情况下,您可以使用 pandas 的数据类型category
将字符串映射到索引(请参阅分类数据)。因此,没有必要使用scikit-learn的LabelEncoder或OneHotEncoder。
import pandas as pd
df = pd.read_csv('54055554.csv', header=0, dtype={
'type': 'category', # <--
'amount': float,
'nameOrig': str,
'oldbalanceOrg': float,
'newbalanceOrig': float,
'nameDest': str,
'oldbalanceDest': float,
'newbalanceDest': float,
'isFraud': bool,
'isFlaggedFraud': bool
})
print(dict(enumerate(df['type'].cat.categories)))
# {0: 'PAYMENT', 1: 'TRANSFER'}
print(list(df['type'].cat.codes))
# [0, 0, 1]
来自 CSV 的数据:
type, ...
PAYMENT, ...
PAYMENT, ...
TRANSFER, ...
转换
首先,您需要使用 LableEncoder
类转换三列。
编码分类数据
好吧,这里有类型作为分类值。为此,您可以使用sklearn.preprocessing
中提供的类OneHotEncoder
。
避免虚拟变量陷阱
然后,您需要通过删除用于表示类型的任何一个列来避免虚拟变量陷阱。
法典
在这里,我提供了示例代码供您参考。
import pandas as pd
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
dataset = pd.read_csv('cs.csv')
X = dataset.iloc[:].values
labelencoder = LabelEncoder()
X[:, 0] = labelencoder.fit_transform(X[:, 0])
X[:, 2] = labelencoder.fit_transform(X[:, 2])
X[:, 5] = labelencoder.fit_transform(X[:, 5])
onehotencoder = OneHotEncoder(categorical_features=[0])
X = onehotencoder.fit_transform(X).toarray()
# Avoiding the Dummy Variable Trap
X = X[:, 1:]
您需要将字符串值编码为数字值。在这种情况下,我通常做的是通过非数字特征创建一个表,创建的表包含该特征的所有可能值。然后,在训练模型时使用相应特征表中值的索引。
例:
type_values = ['PAYMENT', 'TRANSFER']