Python 如何解决Get_假人导致的内存错误

Python 如何解决Get_假人导致的内存错误,python,scikit-learn,one-hot-encoding,Python,Scikit Learn,One Hot Encoding,我使用的是Python,数据集有大约100万条记录和大约50个列 其中一些列具有不同的类型,例如IssueCode列可以有7000个不同的代码,另一列SolutionCode可以有1000个代码 我正在尝试建立一个预测模型 因此,我必须使用get_假人转换数据 但这导致了内存错误 文件 C:\Users\am\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\core\restrape\restrape.py, 第963行,in

我使用的是Python,数据集有大约100万条记录和大约50个列

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

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

因此,我必须使用get_假人转换数据

但这导致了内存错误

文件 C:\Users\am\AppData\Local\Continuum\anaconda3\lib\site packages\pandas\core\restrape\restrape.py, 第963行,in_get_dummies_1d 虚拟对象\u mat=np.eyennumber\u of\u cols,dtype=dtype.takecodes,轴=0

记忆者

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

现在我在尝试构建模型时遇到了这个错误

ValueError:无法将字符串转换为浮点:“ABC”

我检查了这个解决方案

我将所有列都转换为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)
由于内存错误,我无法获取_假人,由于字符串到浮点错误,我无法不获取_假人

如何解决这个问题

这是我的密码

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

您可能要做的第一件事是为数据帧列指定适当的数据类型,以减少加载的数据帧cf的内存使用

对于一种热编码,内存问题的一个直接解决方案是使用稀疏数据类型,而不是常规数据类型。有关详细信息,请参阅。这可以通过以下方式实现:

df = pd.get_dummies(df, columns=["IssueCode", "SolutionCode", "Col1", "Col2", "Col3"], 
                    sparse=True, axis=1)
不过,我不确定熊猫的稀疏表示法是否适用于sklearn。如果它不起作用,您可以尝试使用sklearn,它默认也提供稀疏表示

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