Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
tianlh
LightGBM-DCU
Commits
1cacaef9
Commit
1cacaef9
authored
Dec 24, 2016
by
Guolin Ke
Browse files
use int64_t for num_class * num_data
parent
f449a45b
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
35 additions
and
29 deletions
+35
-29
include/LightGBM/boosting.h
include/LightGBM/boosting.h
+2
-2
src/boosting/dart.hpp
src/boosting/dart.hpp
+2
-2
src/boosting/gbdt.cpp
src/boosting/gbdt.cpp
+8
-7
src/boosting/gbdt.h
src/boosting/gbdt.h
+2
-2
src/boosting/score_updater.hpp
src/boosting/score_updater.hpp
+3
-2
src/c_api.cpp
src/c_api.cpp
+2
-4
src/metric/multiclass_metric.hpp
src/metric/multiclass_metric.hpp
+4
-2
src/objective/multiclass_objective.hpp
src/objective/multiclass_objective.hpp
+12
-8
No files found.
include/LightGBM/boosting.h
View file @
1cacaef9
...
@@ -94,7 +94,7 @@ public:
...
@@ -94,7 +94,7 @@ public:
* \param out_len length of returned score
* \param out_len length of returned score
* \return training score
* \return training score
*/
*/
virtual
const
score_t
*
GetTrainingScore
(
data_size
_t
*
out_len
)
=
0
;
virtual
const
score_t
*
GetTrainingScore
(
int64
_t
*
out_len
)
=
0
;
/*!
/*!
* \brief Get prediction result at data_idx data
* \brief Get prediction result at data_idx data
...
@@ -102,7 +102,7 @@ public:
...
@@ -102,7 +102,7 @@ public:
* \param result used to store prediction result, should allocate memory before call this function
* \param result used to store prediction result, should allocate memory before call this function
* \param out_len lenght of returned score
* \param out_len lenght of returned score
*/
*/
virtual
void
GetPredictAt
(
int
data_idx
,
score_t
*
result
,
data_size
_t
*
out_len
)
=
0
;
virtual
void
GetPredictAt
(
int
data_idx
,
score_t
*
result
,
int64
_t
*
out_len
)
=
0
;
/*!
/*!
* \brief Prediction for one record, not sigmoid transform
* \brief Prediction for one record, not sigmoid transform
...
...
src/boosting/dart.hpp
View file @
1cacaef9
...
@@ -63,13 +63,13 @@ public:
...
@@ -63,13 +63,13 @@ public:
* \param out_len length of returned score
* \param out_len length of returned score
* \return training score
* \return training score
*/
*/
const
score_t
*
GetTrainingScore
(
data_size
_t
*
out_len
)
override
{
const
score_t
*
GetTrainingScore
(
int64
_t
*
out_len
)
override
{
if
(
!
is_update_score_cur_iter_
)
{
if
(
!
is_update_score_cur_iter_
)
{
// only drop one time in one iteration
// only drop one time in one iteration
DroppingTrees
();
DroppingTrees
();
is_update_score_cur_iter_
=
true
;
is_update_score_cur_iter_
=
true
;
}
}
*
out_len
=
train_score_updater_
->
num_data
()
*
num_class_
;
*
out_len
=
static_cast
<
int64_t
>
(
train_score_updater_
->
num_data
()
)
*
num_class_
;
return
train_score_updater_
->
score
();
return
train_score_updater_
->
score
();
}
}
...
...
src/boosting/gbdt.cpp
View file @
1cacaef9
...
@@ -83,8 +83,9 @@ void GBDT::ResetTrainingData(const BoostingConfig* config, const Dataset* train_
...
@@ -83,8 +83,9 @@ void GBDT::ResetTrainingData(const BoostingConfig* config, const Dataset* train_
num_data_
=
train_data
->
num_data
();
num_data_
=
train_data
->
num_data
();
// create buffer for gradients and hessians
// create buffer for gradients and hessians
if
(
object_function_
!=
nullptr
)
{
if
(
object_function_
!=
nullptr
)
{
gradients_
.
resize
(
num_data_
*
num_class_
);
size_t
total_size
=
static_cast
<
size_t
>
(
num_data_
)
*
num_class_
;
hessians_
.
resize
(
num_data_
*
num_class_
);
gradients_
.
resize
(
total_size
);
hessians_
.
resize
(
total_size
);
}
}
// get max feature index
// get max feature index
max_feature_idx_
=
train_data
->
num_total_features
()
-
1
;
max_feature_idx_
=
train_data
->
num_total_features
()
-
1
;
...
@@ -372,12 +373,12 @@ std::vector<double> GBDT::GetEvalAt(int data_idx) const {
...
@@ -372,12 +373,12 @@ std::vector<double> GBDT::GetEvalAt(int data_idx) const {
}
}
/*! \brief Get training scores result */
/*! \brief Get training scores result */
const
score_t
*
GBDT
::
GetTrainingScore
(
data_size
_t
*
out_len
)
{
const
score_t
*
GBDT
::
GetTrainingScore
(
int64
_t
*
out_len
)
{
*
out_len
=
train_score_updater_
->
num_data
()
*
num_class_
;
*
out_len
=
static_cast
<
int64_t
>
(
train_score_updater_
->
num_data
()
)
*
num_class_
;
return
train_score_updater_
->
score
();
return
train_score_updater_
->
score
();
}
}
void
GBDT
::
GetPredictAt
(
int
data_idx
,
score_t
*
out_result
,
data_size
_t
*
out_len
)
{
void
GBDT
::
GetPredictAt
(
int
data_idx
,
score_t
*
out_result
,
int64
_t
*
out_len
)
{
CHECK
(
data_idx
>=
0
&&
data_idx
<=
static_cast
<
int
>
(
valid_metrics_
.
size
()));
CHECK
(
data_idx
>=
0
&&
data_idx
<=
static_cast
<
int
>
(
valid_metrics_
.
size
()));
const
score_t
*
raw_scores
=
nullptr
;
const
score_t
*
raw_scores
=
nullptr
;
...
@@ -389,7 +390,7 @@ void GBDT::GetPredictAt(int data_idx, score_t* out_result, data_size_t* out_len)
...
@@ -389,7 +390,7 @@ void GBDT::GetPredictAt(int data_idx, score_t* out_result, data_size_t* out_len)
auto
used_idx
=
data_idx
-
1
;
auto
used_idx
=
data_idx
-
1
;
raw_scores
=
valid_score_updater_
[
used_idx
]
->
score
();
raw_scores
=
valid_score_updater_
[
used_idx
]
->
score
();
num_data
=
valid_score_updater_
[
used_idx
]
->
num_data
();
num_data
=
valid_score_updater_
[
used_idx
]
->
num_data
();
*
out_len
=
num_data
*
num_class_
;
*
out_len
=
static_cast
<
int64_t
>
(
num_data
)
*
num_class_
;
}
}
if
(
num_class_
>
1
)
{
if
(
num_class_
>
1
)
{
#pragma omp parallel for schedule(static)
#pragma omp parallel for schedule(static)
...
@@ -422,7 +423,7 @@ void GBDT::Boosting() {
...
@@ -422,7 +423,7 @@ void GBDT::Boosting() {
Log
::
Fatal
(
"No object function provided"
);
Log
::
Fatal
(
"No object function provided"
);
}
}
// objective function will calculate gradients and hessians
// objective function will calculate gradients and hessians
int
num_score
=
0
;
int
64_t
num_score
=
0
;
object_function_
->
object_function_
->
GetGradients
(
GetTrainingScore
(
&
num_score
),
gradients_
.
data
(),
hessians_
.
data
());
GetGradients
(
GetTrainingScore
(
&
num_score
),
gradients_
.
data
(),
hessians_
.
data
());
}
}
...
...
src/boosting/gbdt.h
View file @
1cacaef9
...
@@ -105,7 +105,7 @@ public:
...
@@ -105,7 +105,7 @@ public:
* \param out_len length of returned score
* \param out_len length of returned score
* \return training score
* \return training score
*/
*/
virtual
const
score_t
*
GetTrainingScore
(
data_size
_t
*
out_len
)
override
;
virtual
const
score_t
*
GetTrainingScore
(
int64
_t
*
out_len
)
override
;
/*!
/*!
* \brief Get prediction result at data_idx data
* \brief Get prediction result at data_idx data
...
@@ -113,7 +113,7 @@ public:
...
@@ -113,7 +113,7 @@ public:
* \param result used to store prediction result, should allocate memory before call this function
* \param result used to store prediction result, should allocate memory before call this function
* \param out_len lenght of returned score
* \param out_len lenght of returned score
*/
*/
void
GetPredictAt
(
int
data_idx
,
score_t
*
out_result
,
data_size
_t
*
out_len
)
override
;
void
GetPredictAt
(
int
data_idx
,
score_t
*
out_result
,
int64
_t
*
out_len
)
override
;
/*!
/*!
* \brief Prediction for one record without sigmoid transformation
* \brief Prediction for one record without sigmoid transformation
...
...
src/boosting/score_updater.hpp
View file @
1cacaef9
...
@@ -20,13 +20,14 @@ public:
...
@@ -20,13 +20,14 @@ public:
*/
*/
ScoreUpdater
(
const
Dataset
*
data
,
int
num_class
)
:
data_
(
data
)
{
ScoreUpdater
(
const
Dataset
*
data
,
int
num_class
)
:
data_
(
data
)
{
num_data_
=
data
->
num_data
();
num_data_
=
data
->
num_data
();
score_
=
std
::
vector
<
score_t
>
(
num_data_
*
num_class
);
size_t
total_size
=
static_cast
<
size_t
>
(
num_data_
)
*
num_class
;
score_
.
resize
(
total_size
);
// default start score is zero
// default start score is zero
std
::
fill
(
score_
.
begin
(),
score_
.
end
(),
0.0
f
);
std
::
fill
(
score_
.
begin
(),
score_
.
end
(),
0.0
f
);
const
float
*
init_score
=
data
->
metadata
().
init_score
();
const
float
*
init_score
=
data
->
metadata
().
init_score
();
// if exists initial score, will start from it
// if exists initial score, will start from it
if
(
init_score
!=
nullptr
)
{
if
(
init_score
!=
nullptr
)
{
for
(
data_
size_t
i
=
0
;
i
<
num_data_
*
num_class
;
++
i
)
{
for
(
size_t
i
=
0
;
i
<
total_size
;
++
i
)
{
score_
[
i
]
=
init_score
[
i
];
score_
[
i
]
=
init_score
[
i
];
}
}
}
}
...
...
src/c_api.cpp
View file @
1cacaef9
...
@@ -169,7 +169,7 @@ public:
...
@@ -169,7 +169,7 @@ public:
predictor_
.
reset
(
new
Predictor
(
boosting_
.
get
(),
is_raw_score
,
is_predict_leaf
));
predictor_
.
reset
(
new
Predictor
(
boosting_
.
get
(),
is_raw_score
,
is_predict_leaf
));
}
}
void
GetPredictAt
(
int
data_idx
,
score_t
*
out_result
,
data_size
_t
*
out_len
)
{
void
GetPredictAt
(
int
data_idx
,
score_t
*
out_result
,
int64
_t
*
out_len
)
{
boosting_
->
GetPredictAt
(
data_idx
,
out_result
,
out_len
);
boosting_
->
GetPredictAt
(
data_idx
,
out_result
,
out_len
);
}
}
...
@@ -681,9 +681,7 @@ DllExport int LGBM_BoosterGetPredict(BoosterHandle handle,
...
@@ -681,9 +681,7 @@ DllExport int LGBM_BoosterGetPredict(BoosterHandle handle,
float
*
out_result
)
{
float
*
out_result
)
{
API_BEGIN
();
API_BEGIN
();
Booster
*
ref_booster
=
reinterpret_cast
<
Booster
*>
(
handle
);
Booster
*
ref_booster
=
reinterpret_cast
<
Booster
*>
(
handle
);
int
len
=
0
;
ref_booster
->
GetPredictAt
(
data_idx
,
out_result
,
out_len
);
ref_booster
->
GetPredictAt
(
data_idx
,
out_result
,
&
len
);
*
out_len
=
static_cast
<
int64_t
>
(
len
);
API_END
();
API_END
();
}
}
...
...
src/metric/multiclass_metric.hpp
View file @
1cacaef9
...
@@ -56,7 +56,8 @@ public:
...
@@ -56,7 +56,8 @@ public:
for
(
data_size_t
i
=
0
;
i
<
num_data_
;
++
i
)
{
for
(
data_size_t
i
=
0
;
i
<
num_data_
;
++
i
)
{
std
::
vector
<
double
>
rec
(
num_class_
);
std
::
vector
<
double
>
rec
(
num_class_
);
for
(
int
k
=
0
;
k
<
num_class_
;
++
k
)
{
for
(
int
k
=
0
;
k
<
num_class_
;
++
k
)
{
rec
[
k
]
=
static_cast
<
double
>
(
score
[
k
*
num_data_
+
i
]);
size_t
idx
=
static_cast
<
size_t
>
(
num_data_
)
*
k
+
i
;
rec
[
k
]
=
static_cast
<
double
>
(
score
[
idx
]);
}
}
// add loss
// add loss
sum_loss
+=
PointWiseLossCalculator
::
LossOnPoint
(
label_
[
i
],
rec
);
sum_loss
+=
PointWiseLossCalculator
::
LossOnPoint
(
label_
[
i
],
rec
);
...
@@ -66,7 +67,8 @@ public:
...
@@ -66,7 +67,8 @@ public:
for
(
data_size_t
i
=
0
;
i
<
num_data_
;
++
i
)
{
for
(
data_size_t
i
=
0
;
i
<
num_data_
;
++
i
)
{
std
::
vector
<
double
>
rec
(
num_class_
);
std
::
vector
<
double
>
rec
(
num_class_
);
for
(
int
k
=
0
;
k
<
num_class_
;
++
k
)
{
for
(
int
k
=
0
;
k
<
num_class_
;
++
k
)
{
rec
[
k
]
=
static_cast
<
double
>
(
score
[
k
*
num_data_
+
i
]);
size_t
idx
=
static_cast
<
size_t
>
(
num_data_
)
*
k
+
i
;
rec
[
k
]
=
static_cast
<
double
>
(
score
[
idx
]);
}
}
// add loss
// add loss
sum_loss
+=
PointWiseLossCalculator
::
LossOnPoint
(
label_
[
i
],
rec
)
*
weights_
[
i
];
sum_loss
+=
PointWiseLossCalculator
::
LossOnPoint
(
label_
[
i
],
rec
)
*
weights_
[
i
];
...
...
src/objective/multiclass_objective.hpp
View file @
1cacaef9
...
@@ -38,17 +38,19 @@ public:
...
@@ -38,17 +38,19 @@ public:
for
(
data_size_t
i
=
0
;
i
<
num_data_
;
++
i
)
{
for
(
data_size_t
i
=
0
;
i
<
num_data_
;
++
i
)
{
std
::
vector
<
double
>
rec
(
num_class_
);
std
::
vector
<
double
>
rec
(
num_class_
);
for
(
int
k
=
0
;
k
<
num_class_
;
++
k
){
for
(
int
k
=
0
;
k
<
num_class_
;
++
k
){
rec
[
k
]
=
static_cast
<
double
>
(
score
[
k
*
num_data_
+
i
]);
size_t
idx
=
static_cast
<
size_t
>
(
num_data_
)
*
k
+
i
;
rec
[
k
]
=
static_cast
<
double
>
(
score
[
idx
]);
}
}
Common
::
Softmax
(
&
rec
);
Common
::
Softmax
(
&
rec
);
for
(
int
k
=
0
;
k
<
num_class_
;
++
k
)
{
for
(
int
k
=
0
;
k
<
num_class_
;
++
k
)
{
score_t
p
=
static_cast
<
score_t
>
(
rec
[
k
]);
score_t
p
=
static_cast
<
score_t
>
(
rec
[
k
]);
size_t
idx
=
static_cast
<
size_t
>
(
num_data_
)
*
k
+
i
;
if
(
label_int_
[
i
]
==
k
)
{
if
(
label_int_
[
i
]
==
k
)
{
gradients
[
k
*
num_data_
+
i
]
=
p
-
1.0
f
;
gradients
[
idx
]
=
p
-
1.0
f
;
}
else
{
}
else
{
gradients
[
k
*
num_data_
+
i
]
=
p
;
gradients
[
idx
]
=
p
;
}
}
hessians
[
k
*
num_data_
+
i
]
=
2.0
f
*
p
*
(
1.0
f
-
p
);
hessians
[
idx
]
=
2.0
f
*
p
*
(
1.0
f
-
p
);
}
}
}
}
}
else
{
}
else
{
...
@@ -56,17 +58,19 @@ public:
...
@@ -56,17 +58,19 @@ public:
for
(
data_size_t
i
=
0
;
i
<
num_data_
;
++
i
)
{
for
(
data_size_t
i
=
0
;
i
<
num_data_
;
++
i
)
{
std
::
vector
<
double
>
rec
(
num_class_
);
std
::
vector
<
double
>
rec
(
num_class_
);
for
(
int
k
=
0
;
k
<
num_class_
;
++
k
){
for
(
int
k
=
0
;
k
<
num_class_
;
++
k
){
rec
[
k
]
=
static_cast
<
double
>
(
score
[
k
*
num_data_
+
i
]);
size_t
idx
=
static_cast
<
size_t
>
(
num_data_
)
*
k
+
i
;
rec
[
k
]
=
static_cast
<
double
>
(
score
[
idx
]);
}
}
Common
::
Softmax
(
&
rec
);
Common
::
Softmax
(
&
rec
);
for
(
int
k
=
0
;
k
<
num_class_
;
++
k
)
{
for
(
int
k
=
0
;
k
<
num_class_
;
++
k
)
{
score_t
p
=
static_cast
<
score_t
>
(
rec
[
k
]);
score_t
p
=
static_cast
<
score_t
>
(
rec
[
k
]);
size_t
idx
=
static_cast
<
size_t
>
(
num_data_
)
*
k
+
i
;
if
(
label_int_
[
i
]
==
k
)
{
if
(
label_int_
[
i
]
==
k
)
{
gradients
[
k
*
num_data_
+
i
]
=
(
p
-
1.0
f
)
*
weights_
[
i
];
gradients
[
idx
]
=
(
p
-
1.0
f
)
*
weights_
[
i
];
}
else
{
}
else
{
gradients
[
k
*
num_data_
+
i
]
=
p
*
weights_
[
i
];
gradients
[
idx
]
=
p
*
weights_
[
i
];
}
}
hessians
[
k
*
num_data_
+
i
]
=
2.0
f
*
p
*
(
1.0
f
-
p
)
*
weights_
[
i
];
hessians
[
idx
]
=
2.0
f
*
p
*
(
1.0
f
-
p
)
*
weights_
[
i
];
}
}
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment