python - 将 sklearn 数据框转换为 Pandas 数据框,保留分类标签
问题描述
我正在使用 sklearn 导入数据:
from sklearn import datasets
dataset = datasets.fetch_openml('credit-g', version = 'active')
sklearn on the fly 将分类数据转换为数字。
现在我想将此数据集转换为 Pandas DataFrame:
data = pd.DataFrame(dataset.data, columns = dataset.feature_names)
data['class'] = pd.Series(dataset.target)
但是此命令会删除所有分类数据-它们现在是数字。
我想要的是在转换原始文本标签代替数字后将具有的数据框。因此,从 sklearn 数据帧转换为 pandas 数据帧后,数据看起来应该与我只是使用命令下载此数据一样:
pd.read_csv("https://www.openml.org/data/get_csv/31/dataset_31_credit-g.arff")
是否可以?
解决方案
从 的文档中fetch_openml
,返回的字典包含:
[...] data : np.array or scipy.sparse.csr_matrix of floats The feature matrix. Categorical features are encoded as ordinals. [...] categories : dict Maps each categorical feature name to a list of values, such that the value encoded as i is ith in the list. [...]
没有不编码分类特征的选项。只要您将使用sklearn
下载数据集,您就会有浮点数而不是字符串。
但是,由于还返回了类别,您可以使用以下分类特征重建“基础”数据集(我不确定它是最快的解决方案,也不是更优雅的解决方案):
from sklearn import datasets
import pandas as pd
import numpy as np
def main():
dataset = datasets.fetch_openml('credit-g', version = 'active')
raws = [
np.take(dataset['categories'][feature], dataset['data'][:,i].astype(int)) # Take string value for categorical features
if feature in dataset['categories'] else dataset['data'][:,i] # Else use the floats as is
for i, feature in enumerate(dataset['feature_names'])
]
data = pd.DataFrame(np.stack(raws, axis=1), columns=dataset.feature_names)
data['class'] = pd.Series(dataset.target)
print("Initial dtypes:")
print(data.dtypes)
dtypes = {
f: 'category' if f in dataset['categories'] else 'float'
for f in dataset['feature_names']
}
dtypes['class'] = 'category'
data = data.astype(dtypes)
print("\nFirst cast:")
print(data.dtypes)
int_cols = [1, 4, 12]
data.iloc[:, int_cols] = data.iloc[:, int_cols].astype('int64')
print("\nInt cast:")
print(data.dtypes)
if __name__ == '__main__':
main()
推荐阅读
- sapui5 - SAPUI5中attachBeforeOpenContextMenu事件的使用问题
- shiny - 下载 DT 中的选定行
- python - 嵌入式 R 尝试除了添加循环
- python - matplotlib:不连续整数的颜色条映射
- data-visualization - 在散景仪表板中添加 fbprophet 时间序列图?
- highcharts - Highcharts Sankey diagram issue
- python - 我如何克服这个 _tkinter.Tcl 错误?
- pandas - How to merge 2 dataframe base on a third dataframe containing multiindex
- go - Golang switch for a types returning boolean values
- java-8 - How to get Flux
from Mono in Spring Reactor API?