gpt4 book ai didi

python - 如何解决由 Get_dummies 引起的内存错误

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:02 24 4
gpt4 key购买 nike

我正在使用 Python,我的数据集包含大约 100 万条记录和大约 50 列

其中一些列具有不同的类型(例如 IssueCode 列可以有 7000 个不同的代码,另一列 SolutionCode 可以有 1000 个代码)

我正在尝试建立一个预测模型。

因此我必须使用 get_dummies 转换数据

但这一直导致这个错误Memory Error

File "C:\Users\am\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\reshape\reshape.py", line 963, in _get_dummies_1d dummy_mat = np.eye(number_of_cols, dtype=dtype).take(codes, axis=0)

MemoryError

我尝试了另一种解决方案,即在不使用单热编码的情况下保留列

现在我在尝试构建模型时遇到此错误

ValueError: could not convert string to float: 'ABC'

我检查了这个解决方案

get_dummies python memory error

我把所有的列都转成int8了,还是一样的错误

df = pd.concat([df.drop('IssueCode', 1), pd.get_dummies(df['IssueCode'],prefix = 'IssueCode_').astype(np.int8)], axis=1)
df = pd.concat([df.drop('SolutionCode', 1), pd.get_dummies(df['SolutionCode'],prefix = 'SolutionCode_').astype(np.int8)], axis=1)
df = pd.concat([df.drop('Col1', 1), pd.get_dummies(df['Col1'],prefix = 'Col1_').astype(np.int8)], axis=1)
df = pd.concat([df.drop('Col2', 1), pd.get_dummies(df['Col2'],prefix = 'Col2_').astype(np.int8)], axis=1)
df = pd.concat([df.drop('Col3', 1), pd.get_dummies(df['Col3'],prefix = 'Col3_').astype(np.int8)], axis=1)

由于内存错误,我无法获取虚拟机,由于字符串 float 错误,我无法不获取虚拟机

如何解决这个问题

这是我的代码

from sklearn.model_selection import cross_val_predict
import pymssql
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
import datetime
import random
from sklearn.ensemble import RandomForestRegressor


pd.set_option('display.max_rows', 5000)
pd.set_option('display.max_columns', 5000)
pd.set_option('display.width', 10000)


TaskTime = 900
RunTime = 120
sFolder = "/mnt/c/temp/"

def Lead0(value):
return "0" + str(value) if value < 10 else str(value)

dNow = datetime.datetime.now()
sNow = Lead0(dNow.year) + Lead0(dNow.month) + Lead0(dNow.day) + Lead0(dNow.hour) + Lead0(dNow.minute) + Lead0(dNow.second)

print(sNow)

conn = pymssql.connect(server="MyServer", database="MyDB", port="1433", user="***", password="*****")
df = pd.read_sql("SELECT * FROM MyTable where MyDate between '1 jul 2018' and '30 jun 2019'", conn)
conn.close()


#df = pd.get_dummies(df)
#When I uncomment this I get Memory Error


mdl = RandomForestRegressor(n_estimators = 500)

y_pred = cross_val_predict(mdl, X, y, cv=5)
#This is causing error String to float

最佳答案

您可能想要做的第一件事是为数据框列指定适当的数据类型,以减少加载数据框的内存使用(参见 https://www.dataquest.io/blog/pandas-big-data/)。

至于单热编码,内存问题的一种直接解决方案是使用稀疏数据类型而不是常规数据类型(有关更多详细信息,请参见 doc)。这可以通过这样的事情来实现:

df = pd.get_dummies(df, columns=["IssueCode", "SolutionCode", "Col1", "Col2", "Col3"], 
sparse=True, axis=1)

不过,我不确定 pandas 的稀疏表示是否适用于 sklearn。如果它不起作用,您可以尝试使用 sklearnOneHotEncoder ,默认情况下还提供稀疏表示。

还有其他分类特征的编码技术可以减少维度(以及内存使用)但需要更多的工作,例如将分类特征的值合并到更大的组中。

关于python - 如何解决由 Get_dummies 引起的内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57487750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com