机器学习遇到的问题,数据处理+

数据集:

科比数据集

各领域数据集

1、数据处理

1、Float类型错误: 'float' object is not iterable等。Float没有str属性之类。

原因:数据中有nan,所以看起来是str类型的数据,被认为成float类型。

解决:对空值做处理

  1. 填充固定值

df['weather'] = df['weather'].fillna('无')

 

  1.  用均值填充

对于数值型的特征,其缺失值也可以用未缺失数据的均值填充,下面对灰度分这个特征缺失值进行均值填充 data['灰度分'] =

data['灰度分'].fillna(data['灰度分'].mean()))
  1.  用众数填充

 与均值类似,可以用未缺失数据的众数来填充缺失值

data['灰度分'] = data['灰度分'].fillna(data['灰度分'].mode()))
  1. 用上下数据进行填充
#用前一个数据进行填充
data['灰度分'] = data['灰度分'].fillna(method='pad')

#用后一个数据进行填充
data['灰度分'] = data['灰度分'].fillna(method='bfill')
  1. 用插值法填充
data['灰度分'] = data['灰度分'].interpolate()
  1.  用KNN进行填充
from fancyimpute import BiScaler, KNN, NuclearNormMinimization, SoftImpute

dataset = KNN(k=3).complete(dataset)

 

判断数据是不是空

计算每列空值的个数

df.isnull().sum()

np.isnan(df).sum()

 

删掉空值

df.dropna(inplace=True)

 

时间类型转换

df["time"] = pd.to_datetime(df["time"])

df["targets"] = (df["time1"] - df["time2"]).dt.total_seconds()/60  得到的是分钟差

 

 

分组并统计每组的个数

df.groupby(["lie"]).count() 返回的是一个dataframe类型的多列数据,每列的值都是一样的,都是这组数据的个数

 

 

用函数处理列的数据

def hanshu(x):

    if x =="": #缺少数据

        return -1        

    elif 'A' in x:

        return 1

    elif 'B' in x:

        return 2

    else:  

        return 0

df['lie'] =df['lie'].apply(hanshu)

 

转换列的类型

df['distance'] = df['distance'].astype(int)

 

Dataframe移动列的顺序

train.columns    #显示所有的列

order = ['label1', 'label2','targets']  #新的顺序

train = train[order] #调整顺序

 

只要一部分数据

data = customers.iloc[:,:-1]

target = customers.iloc[:,-1]

data = customers[colnames]

 

 

删除某一列

customers.drop(labels=['CustomerID'],axis = 1,inplace=True)

 

 

ValueError: Found input variables with inconsistent numbers of samples: [x,y]

出现这种错误是因为在训练的过程中,测试的数据个数与测试结果的个数不对应。

原文链接:https://blog.csdn.net/weixin_38648232/article/details/85084422

 

模型中的错误

回归预测模型,使用的lightgbm,训练集的均方误差60,测试集均方误差7。

可能原因:

1、训练集中有异常数据,检查训练集的预测目标中的数据,找到了错因,之前数据做了平滑处理,计算误差的时候忘记了。本来来数据范围在[0,100]之间,平滑处理之后都成了[0-5]不出错才怪呢。或者还有可能是本该在[0,100]之间,结果数据中有范围之外的数据,一定要处理好异常数据。

plt.rcParams['savefig.dpi']=300 
plt.rcParams['figure.dpi'] = 100 
plt.rcParams['figure.figsize']=(8.0,6.0)
plt.figure()
plt.scatter(list(range(len(y_train))),y_train,label='real',color='black',s=1)
plt.plot(list(range(len(y_pred_train))),y_pred_train,label='predict',color='r')
plt.legend()
plt.show()

代码原文链接:https://blog.csdn.net/weixin_41779359/article/details/90439889

2、测试集与训练集关系密切

有得数据,最好不要用 x_train,x_test, y_train, y_test = train_test_split(X,Y,test_size=0.3, random_state=0)

最好是使用某些不在训练集中的无关的特征比如日期来分割训练集和测试集。因为test_size的方法可能会造成测试集与训练集的相关性比较大,导致测试集的结果【看起来】好。

一定要认真检查代码!!!

python错误

拼接两个Iist

#引号错了
a = ['a','b']

b = [‘c’,’d’]


#append方法是把整个东西都放进去

c = a.append(b)

#输出[‘a’,’b’,[‘c’,’d’]]


#extend方法拼接两个list,没有返回值,直接修改list

a.extend(b)

print(a)

#输出的是[‘a’,’b,’c’,’d’]

取字典中第一个元素的value或者key

key = dict.keys()[0]
value = dict[key]

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值