本节主要记录实操过程中python进行模型训练(主要是支撑向量机),最终取得了87%的evaluate。
实战部分
如何使用python将两份csv文件进行合并?
import pandas as pd
# Read the two CSV files
df1 = pd.read_csv('table1.csv')
df2 = pd.read_csv('table2.csv')
# Concatenate the two tables
df = pd.concat([df1, df2])
# Save the combined table to a new CSV file
df.to_csv('combined_table.csv', index=False)
18939 上报中明确可使用的自变量
- enterScene
- VideoDurationMs : 视频录制时长
- VideoSource : 视频来源
- VideoType
- videoDuration
编辑相关:
- VideoEmoji
- VideoText
- VideoMusicId : Todo: 改成 0/1 ✅
- IsSearchMusic
- HasWording
- LbsFlag
- Url : Todo : 改成0/1 ✅
- EditDraftFlag
- Tag : Todo : 改成0/1 ✅
- IsHaveCover
- MentionUsercnt
我想在excel中写一个条件,如果某一列的值大于0,那就变成1,不然就是0。我应该怎么做呢?
您可以使用 Excel 的 IF 函数来实现此目的。IF 函数允许您指定一个条件,如果条件为真,则返回一个值,否则返回另一个值。
例如,假设您想在第 A 列中的每个单元格中执行此操作,则可以在第 B 列中使用以下公式:
=IF(A1>0, 1, 0)
同理,如果某一列有值,那就变成1,不然就是0:
=IF(ISBLANK(A1), 0, 1)
同理,如果某一列字符串字数超过3个,那就变成1,不然就是0:
=IF(LEN(A1)>3, 1, 0)
机器学习的数据处理中,如果有一些变量表示场景值,比如1表现来自朋友圈,2表示来自消息会话,这种变量还需要进行标准化处理吗?
在机器学习中,通常需要对数据进行预处理,包括标准化。标准化是指将数据转换为具有相同尺度的数据,以便机器学习模型能够更好地学习和推理。
对于您提到的场景变量,如果它们是类别变量,则通常不需要进行标准化。但是,如果它们是连续变量,则可能需要进行标准化。例如,如果它们表示不同场景的次数,则可能需要将它们标准化为具有相同尺度的数据,以便机器学习模型能够更好地处理它们。
在进行数据预处理时,应该先分析数据,了解数据的分布和类型,然后再决定是否需要进行标准化。一般来说,对于大多数机器学习模型来说,将数据标准化到相同的尺度是很重要的,因为这有助于提高模型的准确度和性能。但是,有时标准化数据可能会带来一些问题,因此应该谨慎使用。
类别变量和连续变量的区别是什么?
类别变量是指取值只能是一组已定义的离散值的变量。例如,性别(男性或女性)、季节(春、夏、秋、冬)等都是类别变量。
连续变量是指取值可以是任意实数的变量。例如,体重、身高等都是连续变量。
在机器学习中,类别变量和连续变量通常需要不同的处理方式。例如,对于类别变量,通常需要进行独热编码,即将每个类别变量转换为一个二元特征向量。对于连续变量,通常需要进行标准化,即将变量转换为具有相同尺度的数据。
总之,类别变量和连续变量是机器学习中常见的两种数据类型,它们在数据预处理时通常需要不同的处理方式。
如何对类别变量进行 ont-hot 编码?
独热编码(one-hot encoding)是将类别变量转换为二元特征向量的过程。它的基本思想是为每个类别创建一个二元特征,并将该特征的值设为1,其余特征的值设为0。这样,原来的类别变量就被转换为一组二元特征向量,每个特征向量只有一个维度的值为1,其余维度的值均为0。
举个例子,假设有一个类别变量,其取值有三种:”男”、”女” 和 “未知”。那么对该变量进行独热编码后,就会得到三个二元特征向量:
第一个特征向量:[1, 0, 0],表示”男”。
第二个特征向量:[0, 1, 0],表示”女”。
第三个特征向量:[0, 0, 1],表示”未知”。
可以使用一些机器学习库或工具,如 scikit-learn、pandas 等,来轻松地对类别变量进行独热编码。例如,在 pandas 中,可以使用 get_dummies 函数对类别变量进行独热编码,如下所示:
import pandas as pd
# 假设有一个包含类别变量的 DataFrame
df = pd.DataFrame({'gender': ['男', '女', '未知']})
# 使用 get_dummies 函数对类别变量进行独
使用pandas 读取数据:
import pandas as pd
# 读取 xlsx 文件
df = pd.read_excel('/Volumes/资料存储/答辩相关/数据源/post_data.xlsx')
# 打印 DataFrame 对象
print(df)
将3个excel表格进行合并
要对 某些列进行标准化处理:
import pandas as pd
# Read data from an Excel file
df = pd.read_excel('file.xlsx')
# Normalize the values in the first column
df['first_column'] = (df['first_column'] - df['first_column'].mean()) / df['first_column'].std()
要处理的列:
- videoDuration
- videoBitrate
- width_height
- videoFrameRate
- audioBitrate
- audioChannelsPerFrame
要对 哪些列进行 one-hot 处理?
- EnterScene
- VideoType
代码部分
import pandas as pd
# 读取 xlsx 文件
df = pd.read_csv('/Users/blibli/Documents/答辩数据/merged_data.csv', low_memory=False)
# 连续数据标准化处理
df['videoDuration'] = (df['videoDuration'] - df['videoDuration'].mean()) / df['videoDuration'].std()
df['width_height'] = (df['width_height'] - df['width_height'].mean()) / df['width_height'].std()
df['videoFrameRate'] = (df['videoFrameRate'] - df['videoFrameRate'].mean()) / df['videoFrameRate'].std()
df['audioChannelsPerFrame'] = (df['audioChannelsPerFrame'] - df['audioChannelsPerFrame'].mean()) / df['audioChannelsPerFrame'].std()
df['audioBitrate'] = (df['audioBitrate'] - df['audioBitrate'].mean()) / df['audioBitrate'].std()
df['videoBitrate'] = (df['videoBitrate'] - df['videoBitrate'].mean()) / df['videoBitrate'].std()
df['audioBitrate'] = (df['audioBitrate'] - df['audioBitrate'].mean()) / df['audioBitrate'].std()
df['postPageTimeMs'] = (df['postPageTimeMs'] - df['postPageTimeMs'].mean()) / df['postPageTimeMs'].std()
df['VideoEmoji'] = (df['VideoEmoji'] - df['VideoEmoji'].mean()) / df['VideoEmoji'].std()
df['VideoText'] = (df['VideoText'] - df['VideoText'].mean()) / df['VideoText'].std()
df['MentionUsercnt'] = (df['MentionUsercnt'] - df['MentionUsercnt'].mean()) / df['MentionUsercnt'].std()
df['ClickMentionCnt'] = (df['ClickMentionCnt'] - df['ClickMentionCnt'].mean()) / df['ClickMentionCnt'].std()
df['MentionCnt'] = (df['MentionCnt'] - df['MentionCnt'].mean()) / df['MentionCnt'].std()
df_onehot = pd.get_dummies(df, columns=['EnterScene', 'VideoSource', 'VideoType'])
# 使用 pop 方法将 'postRet_format' 列从 DataFrame 中移除
postRet_format_column = df_onehot.pop('postRet_format')
# 使用 assign 方法将 'postRet_format' 列添加到 DataFrame 的末尾
df_onehot = df_onehot.assign(postRet_format=postRet_format_column)
df_onehot = df_onehot.head(10000)
from sklearn.model_selection import train_test_split
# 将数据分成特征和目标
X = df_onehot.iloc[:, :45] # 选择前 41 列作为特征
y = df_onehot.iloc[:, 45] # 选择第 42 作为目标
# 使用RFE筛选出前10的特征量
# Recursive Feature Elimination(RFE)算法是数据竞赛中最为流行的特征筛选方案之一
# selector = RFE(model, n_features_to_select=10)
# X_new = selector.fit_transform(X, y)
# print(X_new)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.feature_selection import RFE
from sklearn.svm import SVC
# 将数据分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建SVM模型
model = SVC(kernel='linear')
# 在训练数据上训练模型
model.fit(X_train, y_train)
# 在测试数据上测试模型
y_pred = model.predict(X_test)
# 计算模型的准确率
accuracy = accuracy_score(y_test, y_pred)
print('准确率:', accuracy)
准确率: 0.865
备注:调整数据集规模,最大也只是87.5%,更换了内核之后,准确率在 67% 左右(sigmoid、poly、rbf)
- - - - - - 逻辑回归 - - - - - -
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.feature_selection import RFE
from sklearn.svm import SVC
# 将数据分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建SVM模型
model = LogisticRegression(solver='lbfgs', max_iter=1000)
# 使用RFE筛选出前10的特征量
# Recursive Feature Elimination(RFE)算法是数据竞赛中最为流行的特征筛选方案之一
# selector = RFE(model, n_features_to_select=10)
# X_new = selector.fit_transform(X, y)
# print(X_new)
# 将数据分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 在训练数据上训练模型
model.fit(X_train, y_train)
# 在测试数据上测试模型
y_pred = model.predict(X_test)
# 计算模型的准确率
accuracy = accuracy_score(y_test, y_pred)
print('准确率:', accuracy)
准确率:87%
- - - - - - 线性回归模型(不能用) - - - - - -
Error: Classification metrics can't handle a mix of binary and continuous targets
- - - - - - 输出自变量影响排行 - - - - - -
from sklearn.svm import SVC
import numpy as np
# 获取模型的特征重要性
importances = model.coef_
# 对重要性进行排序,找出最重要的自变量
sorted_indices = np.argsort(importances)[::-1]
# 打印出最重要的自变量的索引
print(sorted_indices)
print(df_onehot.columns)
# print(df_onehot.columns[39])
Todo:
需要采集的数据:
- 在发表页面退后台次数
- 发表人认证type
- 用户之前累计退出发表的次数
- 用户发表的动态个数
- 用户userPrepare点赞、收藏的数目
- 在编辑同步等待的时长(沉没成本)
- 图片的宽高也要加上
- 性别
- 字体大小
- 关怀模式
加了一个数据 hasFinderAccount ,准确率提升了6个点。