本节主要记录实操过程中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个点。