首页 > 其他分享 >机器学习建模中--先“特征选择”还是先“划分数据集”?

机器学习建模中--先“特征选择”还是先“划分数据集”?

时间:2023-03-28 23:15:50浏览次数:53  
标签:random 特征选择 selected 建模 -- train lr test new

应该先进行“特征选择”,再“划分数据集”。这样可以避免数据泄露。
测试集就应该当做“看不见的数据”,只能在最后用一次,按照这个原则处理。

代码实例:

# -*- coding: utf-8 -*-


import numpy as np
from sklearn.feature_selection import SelectKBest
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score


#===================错误做法:特征选择在前,划分数据集在后============================

# #---错误做法的结果很好----
# # random data:
# X = np.random.randn(500, 10000)
# y = np.random.choice(2, size=500)

# selector = SelectKBest(k=25)
# # first select features
# X_selected = selector.fit_transform(X,y)
# # then split
# X_selected_train, X_selected_test, y_train, y_test = train_test_split(X_selected, y, test_size=0.25, random_state=42)

# # fit a simple logistic regression
# lr = LogisticRegression()
# lr.fit(X_selected_train,y_train)

# # predict on the test set and get the test accuracy:
# y_pred = lr.predict(X_selected_test)
# acc = accuracy_score(y_test, y_pred)
# print(acc)
# #几次结果为0.712,0.688,0.792,0.776,0.648

# #---检验一下这种错误做法;泛化性能很差----
# X_new = np.random.randn(500, 10000)
# y_new = np.random.choice(2, size=500)
# # select the same features in the new data
# X_new_selected = selector.transform(X_new)
# # predict and get the accuracy:
# y_new_pred = lr.predict(X_new_selected)
# acc_new = accuracy_score(y_new, y_new_pred)
# print(acc_new)
# # 几次结果为:0.498,0.504, 0.492, 0.538


#=============正确做法:先划分数据集,再特征选择===============================
# random data:
X = np.random.randn(500, 10000)
y = np.random.choice(2, size=500)

# split first
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
# then select features using the training set only
selector = SelectKBest(k=25)
X_train_selected = selector.fit_transform(X_train,y_train)

# fit again a simple logistic regression
lr = LogisticRegression()
lr.fit(X_train_selected,y_train)
# select the same features on the test set, predict, and get the test accuracy:
X_test_selected = selector.transform(X_test)
y_pred = lr.predict(X_test_selected)
acc = accuracy_score(y_test, y_pred)
print(acc)
# 几次的结果为:0.48,0.472,0.52

参考:关于机器学习:特征选择应该在Train-Test Split之前还是之后进行?

标签:random,特征选择,selected,建模,--,train,lr,test,new
From: https://www.cnblogs.com/ethan-wen/p/17267120.html

相关文章

  • 【杂文】renpy漫游记
    【杂文】renpy漫游记程序工作基本告一段落了。后续如果有新的折磨再补充(希望不要再有了TAT)。1.【隐藏对话框】在剧本文件中可以直接用指令windowhide隐藏。如果要做......
  • kernel——内存管理
    0.背景知识0.1.硬件sram:硬件复杂,成本高,CPU通过A0-A18个地址线一次输入要访问的地址,就能获得数据,所以CPU能直接访问ddrsdram:硬件简单,成本低,但CPU需要通过a0-a10......
  • trading view 学习
    中文开发文档网站:https://zlq4863947.gitbook.io/tradingview/参考:https://github.com/zlq4863947/tradingViewWikiCn参考:https://cn.tradingview.com/lightweight-cha......
  • 结构体-C语言
    结构和本地变量一样,在函数内部声明的结构类型只能在函数内部使用所以通常在函数外部声明的结构类型,这样就可以被多个函数所使用了以下类似代码参考:1#include<stdio.......
  • spring注册bean
    spring是怎么注册一个bean的doGetObjectFromFactoryBean:177,FactoryBeanRegistrySupport(org.springframework.beans.factory.support)getObjectFromFactoryBean:101,......
  • order by是怎么工作的?
    orderby是怎么工作的?在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有......
  • 最长递增
    最长递增题目描述在数列a_1,a_2,...,a_n中,如果a_i<a_{i+1}<a_{i+2}<...<a_j,则称a_i至a_j为一段递增序列,长度为j-i+1。定一个数列,请问数列中最长的递增......
  • 安装开发环境
    卸载JDK的方式1.删除java的安装目录2.删除JAVA_HOME3.删除path下关于java的目录4.java-version安装JDK1.百度搜索JDK8,找到下载地址2.同意协议3.下载电脑对应版本......
  • 001-Idea用法-在pom.xml文件中增加模板注释
    XML文件注释快捷键为:Ctrl+Shift+/  今天发现,在pom.xml文件中写注释,输入<!,没有任何提示,想写个完整的注释,还需要<!-- -->把这一串完整的写进去,然后中间空两格,再写中间......
  • 实验二
    task1.pyx='nbaFIFA'print(x.upper())print(x.lower())print(x.swapcase())print()x='abc'print(x.center(10,'*'))print(x.ljust(10,'*'))print(x.rjust(10,'*'......