[机器学习]sklearn入门指南(1)

简介

scikit-learn(简称sklearn)是一个开源的Python机器学习库,它提供了简单而高效的工具用于数据挖掘和数据分析,并且拥有一个活跃的开发社区。它建立在NumPy、SciPy和matplotlib这些科学计算库之上,旨在提供一致且可复用的API。
中文社区

安装

python 复制代码
pip install scikit-learn

模型训练与预测

步骤

  1. 导入必要的库:首先需要导入sklearn中你需要用到的模块,以及其他可能需要的库,如numpy、pandas等。

    python 复制代码
    import pandas as pd
    from sklearn.ensemble import RandomForestRegressor
    from sklearn.metrics import mean_absolute_error
    from sklearn.model_selection import train_test_split
  2. 加载数据:从数据路径中加载你的训练数据集

    python 复制代码
    iowa_file_path = '../input/train.csv'
    home_data = pd.read_csv(iowa_file_path)
  3. 划分数据集:将训练数据集划分为训练集和验证集。

    python 复制代码
    y = home_data.SalePrice
    
    features = ['LotArea', 'YearBuilt', '1stFlrSF', '2ndFlrSF', 'FullBath', 'BedroomAbvGr', 'TotRmsAbvGrd']
    X = home_data[features]
    
    train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)
  4. 选择模型:选择一个适合你问题的模型,比如决策树、随机森林、支持向量机等。

    python 复制代码
    rf_model = RandomForestRegressor(random_state=1)
  5. 训练模型:使用训练集数据训练模型。

    python 复制代码
    rf_model.fit(train_X, train_y)
  6. 模型预测和评估:使用验证集数据进行预测,然后评估模型的性能。

    python 复制代码
    rf_val_predictions = rf_model.predict(val_X)
    rf_val_mae = mean_absolute_error(rf_val_predictions, val_y)
  7. 模型优化:根据模型评估的结果,调整模型参数或选择不同的模型进行优化。

    这里通过遍历优化max_leaf_nodes

    python 复制代码
    def cal_mae(mln,train_X,val_X,train_y,val_y):
    	rf_model = RandomForestRegressor(random_state=1, max_leaf_nodes = mln)
    	rf_model.fit(train_X, train_y)
    	rf_val_predictions = rf_model.predict(val_X)
    	rf_val_mae = mean_absolute_error(rf_val_predictions, val_y)
    	return rf_val_mae 
    
    for i in [5,10,25,50,100,150,200]:
    	print(cal_mae(i,train_X,val_X,train_y,val_y))
  8. 预测新数据:使用筛选出来的较优参数用所有训练集训练一个好的模型,对测试数据进行预测。

    python 复制代码
    rf_model_on_full_data = RandomForestRegressor(random_state=1)
    
    rf_model_on_full_data.fit(X,y)
    
    
    test_data_path = '../input/test.csv'
    test_data = pd.read_csv(test_data_path)
    test_X = test_data[features]
    
    test_preds = rf_model_on_full_data.predict(test_X)

完整代码

python 复制代码
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split

iowa_file_path = '../input/train.csv'
home_data = pd.read_csv(iowa_file_path)

y = home_data.SalePrice
features = ['LotArea', 'YearBuilt', '1stFlrSF', '2ndFlrSF', 'FullBath', 'BedroomAbvGr', 'TotRmsAbvGrd']
X = home_data[features]
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)

rf_model = RandomForestRegressor(random_state=1)
rf_model.fit(train_X, train_y)
rf_val_predictions = rf_model.predict(val_X)
rf_val_mae = mean_absolute_error(rf_val_predictions, val_y)

print("Validation MAE for Random Forest Model: {:,.0f}".format(rf_val_mae))

rf_model_on_full_data = RandomForestRegressor(random_state=1)
rf_model_on_full_data.fit(X,y)

test_data_path = '../input/test.csv'
test_data = pd.read_csv(test_data_path)
test_X = test_data[features]

test_preds = rf_model_on_full_data.predict(test_X)

结果保存

to_csv函数可以把DataFrame结果保存成csv文件

python 复制代码
output = pd.DataFrame({'Id': test_data.Id,
                       'SalePrice': test_preds})
output.to_csv('submission.csv', index=False)

模型保存与读取

持久化模型:将训练好的模型保存到文件中,以便以后使用。

  • joblib是一个用于Python的库,它提供了一种高效的序列化方式,特别适合于存储和加载大型NumPy数组、Pandas数据帧(DataFrames)以及机器学习模型等Python对象。
  • joblib特别优化了对大数据的处理,使用内存映射文件(memory-mapped files)来处理大型数据集,这使得它在处理大型数据时比Python的pickle模块更加高效。
python 复制代码
from joblib import dump, load
dump(best_model, 'model.joblib')

加载模型:从文件中加载模型,用于后续的预测或评估。

python 复制代码
loaded_model = load('model.joblib')

缺失值处理

在选择处理缺失值的方法时,重要的是要理解数据缺失的原因,以及缺失值对模型可能产生的影响。有时候,结合多种方法,或者对不同的处理策略进行实验,可以帮助找到最佳的解决方案。

删除含有缺失值的列

这种方法是最简单的处理缺失值的方式,即直接删除任何含有缺失值的列。

优点:操作简单,可以快速减少数据集中的缺失值问题。

缺点:如果被删除的列中大部分值都是完整的,那么模型就会失去很多有用信息。

  • 极端情况下,比如一个数据集有10,000行,其中一列只缺失了一个值,这种方法会将整个列删除,这可能会导致信息的大量丢失。
python 复制代码
m = []
for col in X_train.columns:
    if X_train[col].isnull().sum() != 0:
        m.append(col)
print(m)

reduced_X_train = X_train.drop(m,axis = 1)

插值

插补是一种更为复杂的处理缺失值的方法,它通过填充缺失值来处理。

  • 例如,我们可以将每列的缺失值替换为该列的平均值。

优点:虽然插补的值在大多数情况下不会完全准确,但通常比直接删除整个列能得到更准确的模型结果。

缺点:插补基于某些假设(如均值、中位数等),这些假设可能不总是成立。且某些插补方法(如KNN)可能需要较高的计算成本。

插补可以基于多种不同的策略,如均值、中位数、众数或者使用更复杂的算法如K-最近邻(KNN)来估计缺失值。

SimpleImputer是用于缺失值插补的转换器。

python 复制代码
class sklearn.impute.SimpleImputer(*, missing_values=nan, strategy='mean', fill_value=None, verbose=0, copy=True, add_indicator=False)

SimpleImputer提供了两个主要的方法:fit(X[, y])和fit_transform(X[, y])。

  1. fit(X[, y])
    • 拟合插补:fit方法用于在数据集X上学习缺失值的插补策略。对于数值型数据,这通常意味着计算所有非缺失值的均值、中位数或众数;对于分类数据,则可能是最频繁出现的类别。
    • 不转换数据:fit方法不会改变或转换数据,它仅仅学习插补的参数(如均值、中位数等)。
    • 返回值:fit方法返回SimpleImputer对象本身,这个对象已经根据X的数据更新了其内部状态,存储了用于插补的统计值。
  2. fit_transform(X[, y])
    • 拟合并转换数据:fit_transform方法首先执行fit操作,学习缺失值的插补策略,然后立即应用这个策略来转换数据集X,填充所有的缺失值。
    • 返回转换后的数据:与fit方法不同,fit_transform方法返回转换后的数据集,其中所有的缺失值已经被插补。
python 复制代码
from sklearn.impute import SimpleImputer

imputer = SimpleImputer() 
imputed_X_train = pd.DataFrame(imputer.fit_transform(X_train))
imputed_X_valid = pd.DataFrame(imputer.transform(X_valid))# 只用fit一次

# 插补会删除列名称,需要重新补上
imputed_X_train.columns = X_train.columns
imputed_X_valid.columns = X_valid.columns

插补的扩展

插补是处理缺失值的标准方法,通常效果不错。但是,插补的值可能会系统地高于或低于它们实际的值(这些值在数据集中没有被收集)。或者,含有缺失值的行在其他方面可能是独特的。在这种情况下,模型如果能够考虑哪些值最初是缺失的,将会做出更好的预测。

这种方法在传统的插补基础上进行了扩展。

  • 首先像以前一样对缺失值进行插补。
  • 然后对于原始数据集中有缺失值的每一列,添加一个新列来显示是否插补。
  • 这个新列用来表明原始数据中哪些位置是缺失的,而哪些是后来插补的。

这种方法的优点在于,它不仅保留了数据的完整性,还提供了额外的信息,这可能会帮助模型捕捉到缺失值背后的模式或趋势。

python 复制代码
imputer = SimpleImputer()
imputed_X_train = pd.DataFrame(imputer.fit_transform(X_train))

# 添加一个新列来标记插补的位置
for column in X_train.columns:
    # 检查原始数据集中哪些值是缺失的
    missing_mask = X_train[column].isnull()
    # 在插补后的DataFrame中添加一个新列来标记这些缺失值
    imputed_X_train [f'{column}_missing'] = missing_mask.astype(int)
相关推荐
老刘莱国瑞几秒前
STM32 与 AS608 指纹模块的调试与应用
python·物联网·阿里云
湫ccc2 分钟前
《Opencv》基础操作详解(3)
人工智能·opencv·计算机视觉
Jack_pirate12 分钟前
深度学习中的特征到底是什么?
人工智能·深度学习
微凉的衣柜26 分钟前
微软在AI时代的战略布局和挑战
人工智能·深度学习·microsoft
火星机器人life39 分钟前
基于ceres优化的3d激光雷达开源算法
算法·3d
GocNeverGiveUp39 分钟前
机器学习1-简单神经网络
人工智能·机器学习
Schwertlilien42 分钟前
图像处理-Ch2-空间域的图像增强
人工智能
虽千万人 吾往矣1 小时前
golang LeetCode 热题 100(动态规划)-更新中
算法·leetcode·动态规划
一只敲代码的猪1 小时前
Llama 3 模型系列解析(一)
大数据·python·llama
智慧化智能化数字化方案1 小时前
深入解读数据资产化实践指南(2024年)
大数据·人工智能·数据资产管理·数据资产入表·数据资产化实践指南